diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..d625cbc
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,381 @@
+Changes to version 0.8.7
+------------------------
+- client: added client side control service support for edition 1 and 2 APC CDCs
+- client: ControlObjectClient uses GetVarSpec instead of GetNameList and ReadData to get required information from the server (compatible with more server implementations)
+- client: Added function ControlObjectClient_useConstantT to support constant T parameter during a control sequence (required my some non-standard conformant servers)
+- server: Fixed problem with SqNum in RCBs and reports
+- windows file provider now supports unicode file name and converts them to UTF-8
+- some small API changes (some char* parameter became const char*; new function ClientReport_getDataSetName)
+- client API: added function ClientReport_getDataSetName
+- .NET API: new methods Report.GetDataSetName, ReportControlBlock.GetEntryID, ReportControlBlock.SetEntryID, Dispose methods for ReportControlBlock and IedConnection classes
+- .NET API: fixed bug with garbage collected CommandTerminationHandler
+- server: getNameList response with alphabetically sorted variable names (configurable by CONFIG_MMS_SORT_NAME_LIST option)
+- server: only client that set EditSG can change EditSG and modify variables with FC=SE
+- server: changed ControlObjectClient_create function: doesn't read "Oper" and uses GetVarSpec instead of GetNameList service
+- extended beoglebone demo (write access to GAPC settings, ...)
+- server: File service: support for wildcard character ('*') in requests; support for flat file list
+- server: changed signature of WriteAccessHandler: Handler now returns MmsDataAccessError instead of boolean value!
+- server: added function IedModel_setIedNameForDynamicModel
+- and some more small changes and bug fixes
+
+Changes to version 0.8.6
+------------------------
+- demos: extended beaglebone demo to use SBO control
+- common: fixed bug that led to wrong encoding of large unsigned integer values on big endian systems
+- server: fixed server crash problem when read request contains only LN but no FC
+- server: fixed server sending empty report when RCB is disabled while report is pending during bufTm
+- server: fixed server allowed creation of dynamic data set with wrong LD name
+- server: sending type-inconsistent instead of unknown-error when receiving a write request with invalid value type
+- server: fixed server side SBO control handling code provides wrong ClientConnection object to PerformCheckHandler
+- client: fixed client does not correctly handle GCBs for edition 1 devices. Also will fail for edition 2 devices when optional elements are missing.
+- GOOSE subscriber: fixed - subscriber rejects messages with trailing data (like PRP trail)
+- server: added support for multiple data models with static model generator.
+- client: added function ClientReport_getBufOvfl to client API
+- dotnet: added support to access report entry ID
+
+Changes to version 0.8.5
+------------------------
+- server/GOOSE: better support for GOOSE minTime, maxTime
+- server/GOOSE: it is now configurable which GoCB elements are writable
+- server: fixed problem (buffer overflow) with large report data sets
+- server: improved memory handling in report generation module
+- server/GOOSE: added IedServer_setGooseInterfaceId to change ethernet interface for GOOSE at runtime
+- server: fixed bug in delete data set service (server crashed when client sent an unknown LD name)
+- client: fixed memory leak in IedConnection_readDataSetValues function
+- server: fixed memory alignement problem for buffered reporting on ARM platform
+- client: fixed timeout bug in Socket_connect functions
+- windows: fixed problem with non-blocking socket send function on windows (as a consequence COTP fragmentation and file read service didn't work on the windows platform).
+
+Changes to version 0.8.4
+------------------------
+- server: implemented all optional report elements for buffered reporting
+- server: fixed bug (server crash) for buffered reporting of integer values
+- client: client closes socket after timeout when sending an ABORT message
+- common: removed wrong transport disconnect parameter from session FINISH message
+- client: LastApplError contrlObj detection is now more robust
+- SCL parser: parser consider default values from "DataTypeTemplates" section
+- server: now sending error message when client sends a getDataDefinition with wrong domain name
+- server: fixed standard deviations in unbuffered reporting
+- server: predefined data sets can contain element of multiple logical devices
+- MMS server: added callbacks for deletion and creation of new data sets (named variable lists)
+- and a lot of small buf fixes
+
+
+Changes to version 0.8.3
+------------------------
+- client: better support for optional report elements
+- server: fixed some minor problems with reporting
+- C# API: Fixed report handler and other problems in C# wrapper layer
+- C# API: Fixed problem with data set creation
+- server: support for association specific data sets in reports
+- server: added bufOvl support for buffered reporting
+- server: added support for data-references in reports
+- server: fixed server crash when client tries to read structured SE variables
+- SCL: configuration file creator supports default values from SCL type templates
+
+Changes to version 0.8.2
+------------------------
+- Client: Added adjustable timeout to connect functions
+- Client: Support for T selectors with different size than two bytes
+- GOOSE publisher: added support for explicit GoID
+- GOOSE subscriber: refactored subscriber
+- Server: Added support for setting groups
+- Server: Added support for data references in reports
+- SCL parser: support for "Val" attributes in DA type definitions
+- Server: Added function to disable all GOOSE publishing
+- Client/Server: added helper functions for Dbpos
+- C# API: more features and improved stability
+
+Changes to version 0.8.1
+------------------------
+- IEC 61850/MMS client: IedConnection and MmsConnection objects can now be reused
+- reorganization of library header files
+- C# API provides support for bit string and octet string data type
+- IEC 61850 client/server: Added support for CommandTermination-
+- C# API added handler for CommandTermination messages
+- IEC 61850 server: IED name for static device model can now be configured at runtime
+- Client/server: Fixed problem with association specific data sets
+- GOOSE: fixed triggering GOOSE reports for data set members without trigger condition set
+- Linux/Windows/BSD: added support for select based socket read (reduces CPU load)
+- C# API added support for file services
+- a lot of small bug fixes
+
+Changes to version 0.8
+-----------------------
+- HAL: socket layer. Some changes. read and accept are now non-blocking. Changes the standard implementations (Linux/POSIX, WIN32, BSD) accordingly
+- server stack: added single-threaded and threadless operation modes to better fit to resource constraint devices (added new configuration option CONFIG_MMS_SINGLE_THREADED)
+- some small changes in server side control model handling (ControlHandler return values and behaviour) to enable threadless and single-threaded operation.
+- C# client API extended and XML documentation completed
+- some smaller bug fixes and extensions
+
+
+Changes to version 0.7.8
+------------------------
+- IED client: added client side support for Ed.1 compliant control (client side automatically detects if a control is ed1 or ed2 compliant)
+- Tools: SCL parser throws exceptions if names are defined multiple times in the same context
+- build support for FreeBSD (gmake and cmake)
+- server: fixed BER encoding problen in file close/delete response messages
+- server: fixed wrong reason-for-inclusion encoding for GI/integrity reports in buffered reporting
+- server: fixed endianess issue with report entry id
+- Configuration tools: fixed bug in static model generator - generator does not create RCBs for all logical devices
+- mms server: added support for vmd-scope named variables
+- mms server: support for standard MMS get-name-list behaviour (no flat address space)
+- common: refactored MmsValue string handling
+- some small extensions to C# client API
+
+Changes to version 0.7.7
+------------------------
+- client: fixed encoding bug in file close service
+- Configuration tools: fixed code generator problem with index report control blocks
+- Configuration tools: fixed problem with multiple data sets in a logical node
+- Configuration tools: configuration file generator can now handle arrays of data objects
+- Configuration toosl: configuration file generator does now properly define predefined unicode strings
+- removed some older functions of client API report setup in favor of ClientReportControlBlock
+- client side report handling does no longer require to read the data set before reports can be received
+- added preview version of C# client API
+- added support (HAL) for Mac OS X (thanks to Michael Clausen - HES-SO Valais-Wallis)
+- some fixes in server side report handling (data set containing complex data attributes or FCDOs)
+- buffered reporting: fixed problem when buffer can only hold a single entry
+- fixed problem in function MmsValue_cloneToBuffer used by buffered reporting
+- fixed problem in GOOSE publisher (sqNum starts with 1 instead of 0)
+- added convenience methods IedServer_updateInt64AttributeValue and IedServer_updateVisibleStringAttributeValue
+- added conditional extern "C" declaration to header files for use in C++ projects
+- server now closes TCP socket after sending the ACSE release message
+
+Changes to version 0.7.6
+------------------------
+- Server: fixed bug: authenticator will be called and can accept client connection even if no authentication value is provided
+- Tools: SCL parser accepts SCL files without communication section
+- Server: fixed missing support for nested control objects (required to support IEC 61400-25-2)
+- client API: fixed some bugs in client API functions of version 0.7.5
+- client API: added support to receive CommandTermination message of enhanced control models
+- server API: new function to get access to DataAttribute references without knowing the IED name
+- some other small changes...
+
+Changes to version 0.7.5
+------------------------
+- Client API: added convenience functions to avoid direct handling with MmsValue instances
+- Added timestamp handling functions
+- Configuration tools (genmodel/genconfig) allow specification of access point and IED for SCL files containing more then one IED / access point
+- client/server: COTP layer is now more efficient
+- added server example to illustrate using arrays of data objects
+- MMS server: fixed potential dead-lock problem server side
+- IED server: solved problem that client writes didn't trigger a report
+- MMS server: fixed problem in fileDirectory response
+- server: removed optional transfer syntax field in ACSE layer to improve compatibility with some clients
+- some other smaller bug fixes ...
+
+Changes to version 0.7.4
+------------------------
+- Configurations tools: fixed bug with default values and short addresses for sub data objects and sub data attributes
+- DLL build with Visual Studio now exports functions
+- server stack is more configurable (some services can be excluded to reduce binary size)
+- improved doxygen documentation
+- Client API: control service supports originator value (orIdent/orCat)
+- Server: control service checks for valid originator value
+- fixed problem with blocking client abort function
+- Server API: helper functions for dynamic data model creation now contains support for most CDCs of IEC 61850-7-3 (Ed.2)
+- Client API: client report structure now provides access to report timestamp
+- Configuration tool: fixed data set problem with static model generator of 0.7 series
+- fixed some other minor problems ...
+
+Changes to version 0.7.3
+------------------------
+- Server/Client: MMS deleteFile and renameFile services
+- IEC client API: deleteFile ACSI service
+- fixed bug when compiling for big endian systems
+- Client/Server API: added Quality data type and handling functions
+- Server API: added IedServer_updateQuality, IedServer_updateFloatAttributeValue.. convenience functions.
+- extended cmake builder (contains some experimental configuration options)
+- added install target to cmake and make build systems.
+
+Changes to version 0.7.2
+------------------------
+
+- Server API: added API to create data models at runtime
+- Server: added some helper functions to create common CDCs at runtime
+- Server/ Server API: added configuration file parser
+- Server: Implemented AcseAuthenticator to provide more flexible authentication and access control schemes
+- Server: added windows support for file services (both for Visual Studio and MinGW)
+- Server/Tools: Added access to data attributes by simple integer short addresses ("sAddr" SCL file attribute)
+- Tools: added configuration file generator tool
+- Added examples for using file services and dynamic model features
+- GOOSE publisher: fixed bug - sending wrong confRef field
+
+Changes to version 0.7.1.1
+--------------------------
+
+- Server: fixed long term stack memory leak present in versions 0.7 and 0.7.1
+
+Changes to version 0.7.1
+------------------------
+- Server API: Added IedServer_getFunctionalConstrainedData function to simplify handling of arrays of data objects.
+- Client API: Made connetion parameters for ACSE and lower layers fully configurable (AP-title, AEQualifier, PSel, SSel, TSel) - required to be compatible with some servers
+- MMS server: made number of concurrent TCP connections configurable by CONFIG_MAXIMUM_... define
+- MMS client/server: added MMS status services
+- MMS server: made MMS identify service optional
+- added file access abstraction to HAL
+- MMS client/server: added getFileDirectory, fileOpen, fileRead, fileClose services
+- Client/server: added GetFile ACSI service
+
+Changes to version 0.7
+-----------------------
+- Server: added support for buffered reporting
+- Server: Bug fix: trigger reasons for reports are taken from SCL file
+- Server/Server API: added callback to perform access control on write accesses
+- Server/Server API: added default access policies to writable FCs
+- Client API: get/setGoCBValues ACSI services - new ClientGooseControlBlock class
+- Client API: added callbacks for connection losses
+- GOOSE Subscriber: API change -> use GoCBReference instead of DataSetReference to identify a GOOSE message
+- GOOSE Subscriber: Bug fix: Linux driver now switches interface to promiscuous mode.
+- MMS Client: improved buffer handling
+- MMS Client/MMS Client API: Added functions to browse and read VMD scope variables
+- Client/Client API/Server: Implemented ABORT and RELEASE services
+- Client API: Allows definition of association specific data sets
+- MMS Client API: Removed all occurances of MmsIndication type in MMS client API
+
+Changes to version 0.6
+------------------------
+- Client API: getDataSetDirectory ACSI service
+- Client API: create and delete data set ACSI services
+- Client API: added getRCBValue/setRCBValues ACSI services to improve client support for reporting
+- client side stack: improved error handling
+- Client API: Methods to allow clients track the connection state
+- Client API: Report handler provides access to reason-for-inclusion
+- Server API: added callbacks for connection events
+- Server API: new ClientConnection object that will be handed over to some callback functions to allow connection specific reactions on events -> some callback handler signatures have changed!
+- Added server side support for indexed RCBs
+- more efficient server side buffer handling
+- added BeagleBone LED control demo
+- DEBUG output can be switched on/off for stack components
+- and a lot of small improvements and bug fixes
+
+Changes to version 0.5.3
+------------------------
+- MMS client/server: multiple variables can be written with a single MMS write request
+- changed encoding of boolean to be compatible with buggy server devices
+- added TCP keep alive support to MMS client
+- added IedConnection_triggerGIReport function
+- some enhancements in server side report handling
+- some bug fixes
+
+Changes to version 0.5.2.1
+--------------------------
+- all examples now compile with VC++
+- CMake script supports GOOSE for Windows if winpcap is available
+
+Changes to version 0.5.2
+------------------------
+- fixed problem when compiling with MINGW
+- changed order of FC named variables according to standard
+- fixed some other compatibility problems
+- allows read access to sub-elements of control variables
+- allows write access to GoCB if the control block is not enabled
+- allows dynamically generated datasets to be used with GOOSE
+
+Changes to version 0.5.1
+------------------------
+- made code compatible with Visual Studio C++ (tested with versions 2010/2012)
+- added new build system based on cmake. It is now possible to create solution and project files for different versions ofVisual Studio as well as for other IDEs/toolchains.
+- fixed interoperability problem in ACSE layer
+- added server side support to use dynamically created data sets in reports (addSubscription service according to IEC 61400-25)
+
+Changes to version 0.5
+----------------------
+- client support for control
+- client support for multiple outstanding requests.
+- full server support for all control models and time avtivated control
+- added client and server support for MMS identify service
+- extended build system to build shared libraries (linux shared objects and DLLs) with "make dynlib"
+- some small bug fixes in model generator tool
+- fixed bug in handling reject messages
+
+Changes to version 0.4.1
+------------------------
+- SCL parser/code generator is more tolerant
+- ubrcb supports resv handling
+- fixed problems in presentation layer
+- fixed problems when running on 64 bit systems
+
+
+Changes to version 0.4.0.2
+--------------------------
+- removed too strict requirements in accepting session layer accept message client side.
+- fixed memory management bugs in client and server.
+
+
+Changes to version 0.4.0.1
+--------------------------
+- fixed problem in client association request message in new presentation layer code
+- MMS read access to GoCB and control objects is now more flexibel to be compatible with more clients
+
+Changes to version 0.4
+----------------------
+- GOOSE publisher for windows based on winpcap
+- GOOSE subscriber for linux and windows
+- Started to implement a IEC 61850 client API (supported functions yet: read/write variables, simple model discovery functions, support for receiving reports)
+- reimplemented presentation layer and ACSE for more efficient memory handling.
+- changed error handling in MMS client
+
+Changes to version 0.3.3.1
+--------------------------
+- fixed bug in MMS client that causes a segmentation fault when the connection to the server cannot be established.
+
+Changes to version 0.3.3
+------------------------
+- added facility to observe write access to individual data attributes.
+- added experimental GOOSE publisher code for Linux. The server also exposes configuration parameters with the GoCB.
+- Server now respects the "BufTm" parameter as set by the client or SCL file. This allows related events to be accumulated for the period of time specified by "BufTm" and reported in a single report message.
+
+Changes to version 0.3.2
+------------------------
+- added support functions for MMS time types (MMS_BINARY_TIME and MMS_UTC_TIME).
+- improved server side support for reporting. Reports can now contain TimeOfEntry values. The server now
+respects most of the options for reports set by the client.
+- added Semaphore functions to HAL API (thread.h). Semaphores are used by the server stack for internal
+synchonization.
+- fixed bugs in code that is responsible for remote access to report control blocks.
+- fixed bug in COTP code when TPDU size is larger than 1024 bytes. TPDU size can now be as large as 16384 bytes.
+- fixed bug in Hal_getTimeInMs function for Windows. Window filetime value will now be correctly converted.
+- fixed problems with read access to complex array types (arrays of constructed attribute classes).
+
+Changes to version 0.3.1
+------------------------
+- improved support for reporting - more options are possible, reason code can be included in reports
+- basic support for control model (operate) in server and server API
+- added server example for control model (server_example3)
+
+Changes to version 0.3
+----------------------
+- change server API, access to data model via handles
+- SCL file parser supports buffered and unbuffered report control blocks
+- server support for unbuffered reporting (supported triggers are GI, integrity and value update)
+- MMS client support for MMS information reports
+- MMS stack supports fragmented transmission for MMS getNameList service
+- new structure for examples directory -> each example is in its own directory and has its own Makefile
+- server support for additional ACSI types -> better support for IEC 61850 data models
+- server enforces write access restrictions to the IEC 61850 data model based on functional constraints.
+- added support for TCP keepalive
+- and a lot of bug fixes
+
+Changes to version 0.2.1
+------------------------
+- fixed bug in SCL file parser
+- Added doxygen generated documentation to source distribution
+- some bug fixes
+
+
+Changes to version 0.2
+-----------------------
+- Support for association specific data sets (named variable lists)
+- Support for permanent data sets configured in SCL file
+- fixed bug when deleting data sets
+- data sets can now contain variables of different MMS domains (IEC 61850 logical devices)
+- Changed handling of MMS GetNameList service in MMS client API
+
+Changes to version 0.1.1
+-------------------------
+- a template project and makefile to simplify getting started with the library.
+- New implementation of the model generator tool that now contains its own SCL file parser.
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..13296b5
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,145 @@
+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)
+endif()
+
+project(libiec61850)
+
+set(LIB_VERSION_MAJOR "0")
+set(LIB_VERSION_MINOR "8")
+set(LIB_VERSION_PATCH "7")
+
+# feature checks
+include(CheckLibraryExists)
+check_library_exists(rt clock_gettime "time.h" CONFIG_SYSTEM_HAS_CLOCK_GETTIME)
+
+# check if we are on a little or a big endian
+include (TestBigEndian)
+test_big_endian(PLATFORM_IS_BIGENDIAN)
+
+set(CONFIG_MMS_MAXIMUM_PDU_SIZE "65000" CACHE STRING "Configure the maximum size of an MMS PDU (default 65000)" )
+set(CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS 5 CACHE STRING "Configure the maximum number of clients allowed to connect to the server")
+
+option(BUILD_EXAMPLES "Build the examples" ON)
+
+option(CONFIG_MMS_SINGLE_THREADED "Compile for single threaded version" OFF)
+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_INCLUDE_GOOSE_SUPPORT "Build with GOOSE support" ON)
+
+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_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
+option(DEBUG "Enable debugging mode (include assertions)" OFF)
+option(DEBUG_SOCKET "Enable printf debugging for socket layer" OFF)
+option(DEBUG_COTP "Enable COTP printf debugging" OFF)
+option(DEBUG_ISO_SERVER "Enable ISO SERVER printf debugging" OFF)
+option(DEBUG_ISO_CLIENT "Enable ISO CLIENT printf debugging" OFF)
+option(DEBUG_IED_SERVER "Enable IED SERVER printf debugging" OFF)
+option(DEBUG_IED_CLIENT "Enable IED CLIENT printf debugging" OFF)
+option(DEBUG_MMS_SERVER "Enable MMS SERVER printf debugging" OFF)
+option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF)
+#mark_as_advanced(DEBUG DEBUG_COTP DEBUG_ISO_SERVER DEBUG_ISO_CLIENT DEBUG_IED_SERVER
+# DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT)
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}/config
+ src/common/inc
+ src/goose
+ src/hal/inc
+ src/iec61850/inc
+ src/iec61850/inc_private
+ src/mms/inc
+ src/mms/inc_private
+ src/mms/iso_mms/asn1c
+)
+
+set(API_HEADERS
+ src/hal/inc/hal_time.h
+ src/hal/inc/hal_thread.h
+ src/hal/inc/hal_filesystem.h
+ src/common/inc/libiec61850_common_api.h
+ src/common/inc/linked_list.h
+ src/common/inc/byte_buffer.h
+ src/common/inc/lib_memory.h
+ src/iec61850/inc/iec61850_client.h
+ src/iec61850/inc/iec61850_common.h
+ src/iec61850/inc/iec61850_server.h
+ src/iec61850/inc/iec61850_model.h
+ src/iec61850/inc/iec61850_cdc.h
+ src/iec61850/inc/iec61850_dynamic_model.h
+ src/iec61850/inc/iec61850_config_file_parser.h
+ src/mms/inc/mms_value.h
+ src/mms/inc/mms_common.h
+ src/mms/inc/mms_types.h
+ src/mms/inc/mms_device_model.h
+ src/mms/inc/mms_server.h
+ src/mms/inc/mms_named_variable_list.h
+ src/mms/inc/mms_type_spec.h
+ src/mms/inc/mms_client_connection.h
+ src/mms/inc/iso_connection_parameters.h
+ src/mms/inc/iso_server.h
+ src/mms/inc/ber_integer.h
+ src/mms/inc/asn1_ber_primitive_value.h
+ src/goose/goose_subscriber.h
+ src/goose/goose_receiver.h
+)
+
+IF(WIN32)
+include_directories(
+ src/vs
+)
+ENDIF(WIN32)
+
+# write the detected stuff to this file
+configure_file(config/stack_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h)
+
+if(BUILD_EXAMPLES)
+ add_subdirectory(examples)
+endif(BUILD_EXAMPLES)
+
+add_subdirectory(src)
+
+INSTALL(FILES ${API_HEADERS} DESTINATION include/libiec61850)
+
+
+IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
+INCLUDE(InstallRequiredSystemLibraries)
+
+SET(CPACK_SET_DESTDIR "on")
+SET(CPACK_INSTALL_PREFIX "/usr")
+SET(CPACK_GENERATOR "DEB")
+
+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 "The libIEC61850 project")
+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_DEBIAN_PACKAGE_PRIORITY "optional")
+SET(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
+
+SET(CPACK_COMPONENTS_ALL Libraries ApplicationData)
+INCLUDE(CPack)
+
+ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
+
+
+
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program 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.
+
+ This program 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 this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..816d55f
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,160 @@
+LIBIEC_HOME=.
+
+include make/target_system.mk
+
+LIB_SOURCE_DIRS = src/mms/iso_acse
+LIB_SOURCE_DIRS += src/mms/iso_acse/asn1c
+LIB_SOURCE_DIRS += src/mms/iso_presentation/asn1c
+LIB_SOURCE_DIRS += src/mms/iso_presentation
+LIB_SOURCE_DIRS += src/mms/iso_session
+LIB_SOURCE_DIRS += src/common
+LIB_SOURCE_DIRS += src/mms/asn1
+LIB_SOURCE_DIRS += src/mms/iso_cotp
+LIB_SOURCE_DIRS += src/mms/iso_mms/server
+LIB_SOURCE_DIRS += src/mms/iso_mms/client
+LIB_SOURCE_DIRS += src/mms/iso_client
+LIB_SOURCE_DIRS += src/mms/iso_common
+LIB_SOURCE_DIRS += src/mms/iso_mms/common
+LIB_SOURCE_DIRS += src/mms/iso_mms/asn1c
+LIB_SOURCE_DIRS += src/mms/iso_server
+ifndef EXCLUDE_ETHERNET_WINDOWS
+LIB_SOURCE_DIRS += src/goose
+endif
+LIB_SOURCE_DIRS += src/iec61850/client
+LIB_SOURCE_DIRS += src/iec61850/common
+LIB_SOURCE_DIRS += src/iec61850/server
+LIB_SOURCE_DIRS += src/iec61850/server/model
+LIB_SOURCE_DIRS += src/iec61850/server/mms_mapping
+LIB_SOURCE_DIRS += src/iec61850/server/impl
+ifeq ($(HAL_IMPL), WIN32)
+LIB_SOURCE_DIRS += src/hal/socket/win32
+LIB_SOURCE_DIRS += src/hal/thread/win32
+LIB_SOURCE_DIRS += src/hal/ethernet/win32
+LIB_SOURCE_DIRS += src/hal/filesystem/win32
+LIB_SOURCE_DIRS += src/hal/time/win32
+else ifeq ($(HAL_IMPL), POSIX)
+LIB_SOURCE_DIRS += src/hal/socket/linux
+LIB_SOURCE_DIRS += src/hal/thread/linux
+LIB_SOURCE_DIRS += src/hal/ethernet/linux
+LIB_SOURCE_DIRS += src/hal/filesystem/linux
+LIB_SOURCE_DIRS += src/hal/time/unix
+else ifeq ($(HAL_IMPL), BSD)
+LIB_SOURCE_DIRS += src/hal/socket/bsd
+LIB_SOURCE_DIRS += src/hal/thread/linux
+LIB_SOURCE_DIRS += src/hal/ethernet/bsd
+LIB_SOURCE_DIRS += src/hal/filesystem/linux
+LIB_SOURCE_DIRS += src/hal/time/unix
+endif
+LIB_INCLUDE_DIRS += config
+LIB_INCLUDE_DIRS += src/common/inc
+LIB_INCLUDE_DIRS += src/mms/iso_mms/asn1c
+LIB_INCLUDE_DIRS += src/mms/inc
+LIB_INCLUDE_DIRS += src/mms/inc_private
+LIB_INCLUDE_DIRS += src/hal/inc
+LIB_INCLUDE_DIRS += src/goose
+LIB_INCLUDE_DIRS += src/iec61850/inc
+LIB_INCLUDE_DIRS += src/iec61850/inc_private
+ifeq ($(HAL_IMPL), WIN32)
+LIB_INCLUDE_DIRS += third_party/winpcap/Include
+endif
+
+LIB_INCLUDES = $(addprefix -I,$(LIB_INCLUDE_DIRS))
+
+ifndef INSTALL_PREFIX
+INSTALL_PREFIX = ./.install
+endif
+
+LIB_API_HEADER_FILES = src/hal/inc/hal_time.h
+LIB_API_HEADER_FILES += src/hal/inc/hal_thread.h
+LIB_API_HEADER_FILES += src/hal/inc/hal_filesystem.h
+LIB_API_HEADER_FILES += src/common/inc/libiec61850_common_api.h
+LIB_API_HEADER_FILES += src/common/inc/linked_list.h
+LIB_API_HEADER_FILES += src/common/inc/byte_buffer.h
+LIB_API_HEADER_FILES += src/common/inc/lib_memory.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_client.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_common.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_server.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_model.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_cdc.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_dynamic_model.h
+LIB_API_HEADER_FILES += src/iec61850/inc/iec61850_config_file_parser.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_value.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_common.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_types.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_device_model.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_server.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_named_variable_list.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_type_spec.h
+LIB_API_HEADER_FILES += src/mms/inc/mms_client_connection.h
+LIB_API_HEADER_FILES += src/mms/inc/iso_connection_parameters.h
+LIB_API_HEADER_FILES += src/mms/inc/iso_server.h
+LIB_API_HEADER_FILES += src/mms/inc/ber_integer.h
+LIB_API_HEADER_FILES += src/mms/inc/asn1_ber_primitive_value.h
+LIB_API_HEADER_FILES += src/goose/goose_subscriber.h
+LIB_API_HEADER_FILES += src/goose/goose_receiver.h
+
+get_sources_from_directory = $(wildcard $1/*.c)
+get_sources = $(foreach dir, $1, $(call get_sources_from_directory,$(dir)))
+src_to = $(addprefix $(LIB_OBJS_DIR)/,$(subst .c,$1,$2))
+
+LIB_SOURCES = $(call get_sources,$(LIB_SOURCE_DIRS))
+
+LIB_OBJS = $(call src_to,.o,$(LIB_SOURCES))
+
+CFLAGS += -std=gnu99
+#CFLAGS += -Wno-error=format
+CFLAGS += -Wstrict-prototypes
+
+ifneq ($(HAL_IMPL), WIN32)
+CFLAGS += -Wuninitialized
+endif
+
+CFLAGS += -Wsign-compare
+CFLAGS += -Wpointer-arith
+CFLAGS += -Wnested-externs
+CFLAGS += -Wmissing-declarations
+CFLAGS += -Wshadow
+CFLAGS += -Wall
+#CFLAGS += -Werror
+
+all: lib
+
+static_checks: lib
+ splint -preproc +posixlib +skip-sys-headers +gnuextensions $(LIB_INCLUDES) $(LIB_SOURCES)
+
+cppcheck: lib
+ cppcheck --force --std=c99 --enable=all $(LIB_INCLUDES) $(LIB_SOURCES) 2> cppcheck-output.xml
+
+lib: $(LIB_NAME)
+
+dynlib: CFLAGS += -fPIC
+
+dynlib: $(DYN_LIB_NAME)
+
+.PHONY: examples
+
+examples:
+ cd examples; $(MAKE)
+
+$(LIB_NAME): $(LIB_OBJS)
+ $(AR) r $(LIB_NAME) $(LIB_OBJS)
+ $(RANLIB) $(LIB_NAME)
+
+$(DYN_LIB_NAME): $(LIB_OBJS)
+ $(CC) $(LDFLAGS) $(DYNLIB_LDFLAGS) -shared -o $(DYN_LIB_NAME) $(LIB_OBJS) $(LDLIBS)
+
+$(LIB_OBJS_DIR)/%.o: %.c config
+ @echo compiling $(notdir $<)
+ $(SILENCE)mkdir -p $(dir $@)
+ $(CC) $(CFLAGS) -c $(LIB_INCLUDES) $(OUTPUT_OPTION) $<
+
+install: $(LIB_NAME)
+ mkdir -p $(INSTALL_PREFIX)/include
+ mkdir -p $(INSTALL_PREFIX)/lib
+ cp $(LIB_API_HEADER_FILES) $(INSTALL_PREFIX)/include
+ cp $(LIB_NAME) $(INSTALL_PREFIX)/lib
+
+clean:
+ rm -f $(EXAMPLES)
+ rm -rf $(LIB_OBJS_DIR)
+
diff --git a/README b/README
new file mode 100644
index 0000000..88150ba
--- /dev/null
+++ b/README
@@ -0,0 +1,103 @@
+README:
+-------
+
+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.
+
+Content:
+- Overview
+- Building and running the examples
+- Installing the library and the API headers
+- Building on Windows with GOOSE support
+- Building with the cmake build script
+- C# client API
+- Licensing
+- Third-party contributions
+
+
+Overview
+---------
+
+libiec61850 is an open-source (GPLv3) implementation of an IEC 61850 client and server library. It is implemented in C (according to the C99 standard) to provide maximum portability. It can be used to implement IEC 61850 compliant client and server applications on embedded systems and PCs running Linux and Windows. Included is a set of simple example applications that can be used as a starting point to implement own IEC 61850 compliant devices or to communicate with IEC 61850 devices.
+
+
+Building and running the examples
+----------------------------------------
+
+In the project root directoy type
+
+> make examples
+
+If the build succeeds you can find a few binary files in the projects root directory. You can also find a binary version of the library ("libiec61850.a") in the "build" directory.
+
+Run the sample applications in the example folders. E.g.:
+
+> cd examples/server_example1
+> sudo ./server_example1
+
+on the Linux command line.
+
+You can test the server examples by using a generic client or the provided client example applications.
+
+
+Installing the library and the API headers
+--------------------------------------------
+
+The make and cmake build scripts provide an install target. This target copies the API header files and the static library to a single directory for the headers (INSTALL_PREFIX/include) and the static library (INSTALL_PREFIX/lib). With this feature it is more easy to integrate libiec61850 in an external application since you only have to add a simple include directory to the build tool of your choice.
+
+This can be invoked with
+
+make install
+
+The default install directory for the make build script is ".install".
+
+You can modify this by setting the INSTALL_PREFIX environment variable (e.g.):
+
+make INSTALL_PREFIX=/usr/local install
+
+For the cmake build script you have to provide the CMAKE_INSTALL_PREFIX variable
+
+
+Building on windows with GOOSE support
+---------------------------------------
+
+To build the library and run libiec61850 applications with GOOSE support on Windows (7/8) the use of a third-party library (winpcap) is required. This is necessary because current versions of Windows have no working support for raw sockets. You can download winpcap here (http://www.winpcap.org).
+
+1. Download and install winpcap. Make sure that the winpcap driver is loaded at boot time (you can choose this option at the last screen of the winpcap installer).
+2. Reboot the system (you can do this also later, but you need to reboot or load the winpcap driver before running any llibiec61850 applications that use GOOSE).
+3. Download the winpcap developers pack from here (http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip)
+4. Unpack the zip file. Copy the folders Lib and Include from the WpdPack directory in the third_party/winpcap directory of libiec61850
+
+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.
+
+If you have cmake installed fire up a command line (cmd.exe) and create a new subdirectory in the libiec61850-0.x 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).
+
+cmake -G "Visual Studio 11" ..
+
+will instruct cmake to create a "solution" for Visual Studio 2012. To do the same thing for Visual Studio 2010 type
+
+cmake -G "Visual Studio 10" ..
+
+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-0.x which is in our case the parent directory (..).
+
+To select some configuration options you can use ccmake or cmake-gui.
+
+C# client API
+--------------
+
+A C#/.NET wrapper and examples and Visual Studio/MonoDevelop project files can be found in the dotnet folder. The examples and the C# wrapper API can be build and run on .NET or Mono.
+
+
+Commercial licenses
+-------------------
+Commercial licensing and support options are provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details.
+
+
+Third-party contributions:
+--------------------------
+- The Mac OS X socket and ethernet layer has been kindly contributed by Michael Clausen, HES-SO Valais-Wallis, http://www.hevs.ch
+
+
+
diff --git a/config/stack_config.h b/config/stack_config.h
new file mode 100644
index 0000000..53c649f
--- /dev/null
+++ b/config/stack_config.h
@@ -0,0 +1,200 @@
+/*
+ * config.h
+ *
+ * Contains global defines to configure the stack. You need to recompile the stack to make
+ * changes effective (make clean; make)
+ *
+ */
+
+#ifndef STACK_CONFIG_H_
+#define STACK_CONFIG_H_
+
+/* include asserts if set to 1 */
+#define DEBUG 0
+
+/* print debugging information with printf if set to 1 */
+#define DEBUG_SOCKET 0
+#define DEBUG_COTP 0
+#define DEBUG_ISO_SERVER 0
+#define DEBUG_ISO_CLIENT 0
+#define DEBUG_IED_SERVER 0
+#define DEBUG_IED_CLIENT 0
+#define DEBUG_MMS_CLIENT 0
+#define DEBUG_MMS_SERVER 0
+#define DEBUG_GOOSE_SUBSCRIBER 0
+#define DEBUG_GOOSE_PUBLISHER 0
+
+/* Maximum MMS PDU SIZE - default is 65000 */
+#define CONFIG_MMS_MAXIMUM_PDU_SIZE 65000
+
+/*
+ * Enable single threaded mode
+ *
+ * 1 ==> server runs in single threaded mode (a single thread for the server and all client connections)
+ * 0 ==> server runs in multi-threaded mode (one thread for each connection and
+ * one server background thread )
+ */
+#define CONFIG_MMS_SINGLE_THREADED 0
+
+/*
+ * 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 0
+
+/* number of concurrent MMS client connections the server accepts, -1 for no limit */
+#define CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS 5
+
+/* activate TCP keep alive mechanism. 1 -> activate */
+#define CONFIG_ACTIVATE_TCP_KEEPALIVE 1
+
+/* time (in s) between last message and first keepalive message */
+#define CONFIG_TCP_KEEPALIVE_IDLE 5
+
+/* time between subsequent keepalive messages if no ack received */
+#define CONFIG_TCP_KEEPALIVE_INTERVAL 2
+
+/* number of not missing keepalive responses until socket is considered dead */
+#define CONFIG_TCP_KEEPALIVE_CNT 2
+
+/* maximum COTP (ISO 8073) TPDU size - valid range is 1024 - 8192 */
+#define CONFIG_COTP_MAX_TPDU_SIZE 8192
+
+/* timeout while reading from TCP stream in ms */
+#define CONFIG_TCP_READ_TIMEOUT_MS 1000
+
+/* Ethernet interface ID for GOOSE and SV */
+#define CONFIG_ETHERNET_INTERFACE_ID "eth0"
+//#define CONFIG_ETHERNET_INTERFACE_ID "vboxnet0"
+//#define CONFIG_ETHERNET_INTERFACE_ID "eth-f"
+//#define CONFIG_ETHERNET_INTERFACE_ID "en0" // OS X uses enX in place of ethX as ethernet NIC names.
+
+/* Set to 1 to include GOOSE support in the build. Otherwise set to 0 */
+#define CONFIG_INCLUDE_GOOSE_SUPPORT 1
+
+#ifdef _WIN32
+
+/* GOOSE will be disabled for Windows if ethernet support (winpcap) is not available */
+#ifdef EXCLUDE_ETHERNET_WINDOWS
+#ifdef CONFIG_INCLUDE_GOOSE_SUPPORT
+#undef CONFIG_INCLUDE_GOOSE_SUPPORT
+#endif
+#define CONFIG_INCLUDE_GOOSE_SUPPORT 0
+#define CONFIG_INCUDE_ETHERNET_WINDOWS 0
+#else
+#define CONFIG_INCLUDE_ETHERNET_WINDOWS 1
+#undef CONFIG_ETHERNET_INTERFACE_ID
+#define CONFIG_ETHERNET_INTERFACE_ID "0"
+#endif
+#endif
+
+/* The GOOSE retransmission interval in ms for the stable condition - i.e. no monitored value changed */
+#define CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL 5000
+
+/* The GOOSE retransmission interval in ms in the case an event happens. */
+#define CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL 500
+
+/* The number of GOOSE retransmissions after an event */
+#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 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
+
+/* The default value for the VLAN ID field of the 802.1Q header - the allowed range is 2-4096 or 0 if VLAN/priority is not used */
+#define CONFIG_GOOSE_DEFAULT_VLAN_ID 0
+
+/* Configure the 16 bit APPID field in the GOOSE header */
+#define CONFIG_GOOSE_DEFAULT_APPID 0x1000
+
+/* Default destination MAC address for GOOSE */
+#define CONFIG_GOOSE_DEFAULT_DST_ADDRESS {0x01, 0x0c, 0xcd, 0x01, 0x00, 0x01}
+
+/* include support for IEC 61850 control services */
+#define CONFIG_IEC61850_CONTROL_SERVICE 1
+
+/* The default select timeout in ms. This will apply only if no sboTimeout attribute exists for a control object. Set to 0 for no timeout. */
+#define CONFIG_CONTROL_DEFAULT_SBO_TIMEOUT 15000
+
+/* include support for IEC 61850 reporting services */
+#define CONFIG_IEC61850_REPORT_SERVICE 1
+
+/* The default buffer size of buffered RCBs in bytes */
+#define CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE 65536
+
+/* include support for setting groups */
+#define CONFIG_IEC61850_SETTING_GROUPS 1
+
+/* default reservation time of a setting group control block in s */
+#define CONFIG_IEC61850_SG_RESVTMS 300
+
+/* default results for MMS identify service */
+#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com"
+#define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850"
+#define CONFIG_DEFAULT_MMS_REVISION "0.8.7"
+
+/* MMS virtual file store base path - where file services are looking for files */
+#define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/"
+
+/* Maximum number of open file per MMS connection (for MMS file read service) */
+#define CONFIG_MMS_MAX_NUMBER_OF_OPEN_FILES_PER_CONNECTION 5
+
+/* Maximum number of the domain specific data sets - this also includes the static (pre-configured) and dynamic data sets */
+#define CONFIG_MMS_MAX_NUMBER_OF_DOMAIN_SPECIFIC_DATA_SETS 10
+
+/* Maximum number of association specific data sets */
+#define CONFIG_MMS_MAX_NUMBER_OF_ASSOCIATION_SPECIFIC_DATA_SETS 10
+
+/* Maximum number of VMD specific data sets */
+#define CONFIG_MMS_MAX_NUMBER_OF_VMD_SPECIFIC_DATA_SETS 10
+
+/* Maximum number of the members in a data set (named variable list) */
+#define CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS 50
+
+/* Definition of supported services */
+#define MMS_DEFAULT_PROFILE 1
+
+#if (MMS_DEFAULT_PROFILE == 1)
+#define MMS_READ_SERVICE 1
+#define MMS_WRITE_SERVICE 1
+#define MMS_GET_NAME_LIST 1
+#define MMS_GET_VARIABLE_ACCESS_ATTRIBUTES 1
+#define MMS_DATA_SET_SERVICE 1
+#define MMS_DYNAMIC_DATA_SETS 1
+#define MMS_GET_DATA_SET_ATTRIBUTES 1
+#define MMS_STATUS_SERVICE 1
+#define MMS_IDENTIFY_SERVICE 1
+#define MMS_FILE_SERVICE 1
+#endif /* MMS_DEFAULT_PROFILE */
+
+#if (MMS_WRITE_SERVICE != 1)
+#undef CONFIG_IEC61850_CONTROL_SERVICE
+#define CONFIG_IEC61850_CONTROL_SERVICE 0
+#endif
+
+/* support flat named variable name space required by IEC 61850-8-1 MMS mapping */
+#define CONFIG_MMS_SUPPORT_FLATTED_NAME_SPACE 1
+
+/* VMD scope named variables are not used by IEC 61850 (one application is ICCP) */
+#define CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES 0
+
+/* 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
+
+#endif /* STACK_CONFIG_H_ */
diff --git a/config/stack_config.h.cmake b/config/stack_config.h.cmake
new file mode 100644
index 0000000..011cbf8
--- /dev/null
+++ b/config/stack_config.h.cmake
@@ -0,0 +1,189 @@
+/*
+ * config.h (template for cmake)
+ *
+ * Contains global defines to configure the stack. You need to recompile the stack to make
+ * changes effective (make clean; make)
+ *
+ */
+
+#ifndef STACK_CONFIG_H_
+#define STACK_CONFIG_H_
+
+/* set to 0 for a little-endian target, 1 for a big-endian target */
+#cmakedefine01 PLATFORM_IS_BIGENDIAN
+
+/* define if the system supports clock_gettime */
+#cmakedefine CONFIG_SYSTEM_HAS_CLOCK_GETTIME
+
+/* include asserts if set to 1 */
+#cmakedefine01 DEBUG
+
+/* print debugging information with printf if set to 1 */
+#cmakedefine01 DEBUG_SOCKET
+#cmakedefine01 DEBUG_COTP
+#cmakedefine01 DEBUG_ISO_SERVER
+#cmakedefine01 DEBUG_ISO_CLIENT
+#cmakedefine01 DEBUG_IED_SERVER
+#cmakedefine01 DEBUG_IED_CLIENT
+#cmakedefine01 DEBUG_MMS_CLIENT
+#cmakedefine01 DEBUG_MMS_SERVER
+#cmakedefine01 DEBUG_GOOSE_SUBSCRIBER
+#cmakedefine01 DEBUG_GOOSE_PUBLISHER
+
+/* 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
+ * one server background thread )
+ */
+#cmakedefine01 CONFIG_MMS_SINGLE_THREADED
+
+/* Optimize stack for threadless operation - don't use semaphores */
+#cmakedefine01 CONFIG_MMS_THREADLESS_STACK
+
+/* Maximum MMS PDU SIZE - default is 65000 */
+#cmakedefine CONFIG_MMS_MAXIMUM_PDU_SIZE @CONFIG_MMS_MAXIMUM_PDU_SIZE@
+
+/* number of concurrent MMS client connections the server accepts, -1 for no limit */
+#cmakedefine CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS @CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS@
+
+/* activate TCP keep alive mechanism. 1 -> activate */
+#cmakedefine01 CONFIG_ACTIVATE_TCP_KEEPALIVE
+
+/* time (in s) between last message and first keepalive message */
+#define CONFIG_TCP_KEEPALIVE_IDLE 5
+
+/* time between subsequent keepalive messages if no ack received */
+#define CONFIG_TCP_KEEPALIVE_INTERVAL 2
+
+/* number of not missing keepalive responses until socket is considered dead */
+#define CONFIG_TCP_KEEPALIVE_CNT 2
+
+/* maximum COTP (ISO 8073) TPDU size - valid range is 1024 - 8192 */
+#define CONFIG_COTP_MAX_TPDU_SIZE 8192
+
+/* timeout while reading from TCP stream in ms */
+#define CONFIG_TCP_READ_TIMEOUT_MS 1000
+
+/* Ethernet interface ID for GOOSE and SV */
+#define CONFIG_ETHERNET_INTERFACE_ID "eth0"
+//#define CONFIG_ETHERNET_INTERFACE_ID "vboxnet0"
+//#define CONFIG_ETHERNET_INTERFACE_ID "en0" // OS X uses enX in place of ethX as ethernet NIC names.
+
+/* Set to 1 to include GOOSE support in the build. Otherwise set to 0 */
+#cmakedefine01 CONFIG_INCLUDE_GOOSE_SUPPORT
+
+#ifdef _WIN32
+
+/* GOOSE will be disabled for Windows if ethernet support (winpcap) is not available */
+#ifdef EXCLUDE_ETHERNET_WINDOWS
+#ifdef CONFIG_INCLUDE_GOOSE_SUPPORT
+#undef CONFIG_INCLUDE_GOOSE_SUPPORT
+#endif
+#define CONFIG_INCLUDE_GOOSE_SUPPORT 0
+#define CONFIG_INCUDE_ETHERNET_WINDOWS 0
+#else
+#define CONFIG_INCLUDE_ETHERNET_WINDOWS 1
+#undef CONFIG_ETHERNET_INTERFACE_ID
+#define CONFIG_ETHERNET_INTERFACE_ID "0"
+#endif
+#endif
+
+/* The GOOSE retransmission interval in ms for the stable condition - i.e. no monitored value changed */
+#define CONFIG_GOOSE_STABLE_STATE_TRANSMISSION_INTERVAL 5000
+
+/* The GOOSE retransmission interval in ms in the case an event happens. */
+#define CONFIG_GOOSE_EVENT_RETRANSMISSION_INTERVAL 500
+
+/* The number of GOOSE retransmissions after an event */
+#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
+
+/* The default value for the priority field of the 802.1Q header (allowed range 0-7) */
+#define CONFIG_GOOSE_DEFAULT_PRIORITY 4
+
+/* The default value for the VLAN ID field of the 802.1Q header - the allowed range is 2-4096 or 0 if VLAN/priority is not used */
+#define CONFIG_GOOSE_DEFAULT_VLAN_ID 0
+
+/* Configure the 16 bit APPID field in the GOOSE header */
+#define CONFIG_GOOSE_DEFAULT_APPID 0x1000
+
+/* Default destination MAC address for GOOSE */
+#define CONFIG_GOOSE_DEFAULT_DST_ADDRESS {0x01, 0x0c, 0xcd, 0x01, 0x00, 0x01}
+
+/* include support for IEC 61850 control services */
+#cmakedefine01 CONFIG_IEC61850_CONTROL_SERVICE
+
+/* The default select timeout in ms. This will apply only if no sboTimeout attribute exists for a control object. Set to 0 for no timeout. */
+#define CONFIG_CONTROL_DEFAULT_SBO_TIMEOUT 15000
+
+/* include support for IEC 61850 reporting services */
+#cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE
+
+/* The default buffer size of buffered RCBs in bytes */
+#cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@
+
+/* include support for setting groups */
+#cmakedefine01 CONFIG_IEC61850_SETTING_GROUPS
+
+/* default reservation time of a setting group control block in s */
+#define CONFIG_IEC61850_SG_RESVTMS 100
+
+/* default results for MMS identify service */
+#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com"
+#define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850"
+#define CONFIG_DEFAULT_MMS_REVISION "${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${LIB_VERSION_PATCH}"
+
+/* support flatted named variable name space required by IEC 61850-8-1 MMS mapping */
+#define CONFIG_MMS_SUPPORT_FLATTED_NAME_SPACE 1
+
+/* VMD scope named variables are not used by IEC 61850 */
+#define CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES 0
+
+/* MMS virtual file store base path - where file services are looking for files */
+#define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/"
+
+/* Maximum number of open file per MMS connection (for MMS file read service) */
+#define CONFIG_MMS_MAX_NUMBER_OF_OPEN_FILES_PER_CONNECTION 5
+
+#define CONFIG_MMS_MAX_NUMBER_OF_DOMAIN_SPECIFIC_DATA_SETS 10
+
+#define CONFIG_MMS_MAX_NUMBER_OF_ASSOCIATION_SPECIFIC_DATA_SETS 10
+
+#define CONFIG_MMS_MAX_NUMBER_OF_VMD_SPECIFIC_DATA_SETS 10
+
+/* Maximum number of the members in a data set (named variable list) */
+#define CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS 50
+
+/* Definition of supported services */
+#define MMS_DEFAULT_PROFILE 1
+
+#if MMS_DEFAULT_PROFILE
+#define MMS_READ_SERVICE 1
+#define MMS_WRITE_SERVICE 1
+#define MMS_GET_NAME_LIST 1
+#define MMS_GET_VARIABLE_ACCESS_ATTRIBUTES 1
+#define MMS_DATA_SET_SERVICE 1
+#define MMS_DYNAMIC_DATA_SETS 1
+#define MMS_GET_DATA_SET_ATTRIBUTES 1
+#define MMS_STATUS_SERVICE 1
+#define MMS_IDENTIFY_SERVICE 1
+#define MMS_FILE_SERVICE 1
+#endif /* MMS_DEFAULT_PROFILE */
+
+#if (MMS_WRITE_SERVICE != 1)
+#undef CONFIG_IEC61850_CONTROL_SERVICE
+#define CONFIG_IEC61850_CONTROL_SERVICE 0
+#endif
+
+/* use short FC defines as in old API */
+#define CONFIG_PROVIDE_OLD_FC_DEFINES 0
+
+#endif /* STACK_CONFIG_H_ */
diff --git a/demos/beaglebone/CMakeLists.txt b/demos/beaglebone/CMakeLists.txt
new file mode 100644
index 0000000..eb0d580
--- /dev/null
+++ b/demos/beaglebone/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(beagle_demo_SRCS
+ beagle_demo.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${beagle_demo_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example3
+ ${beagle_demo_SRCS}
+)
+
+target_link_libraries(server_example3
+ iec61850
+)
diff --git a/demos/beaglebone/Makefile b/demos/beaglebone/Makefile
new file mode 100644
index 0000000..202498d
--- /dev/null
+++ b/demos/beaglebone/Makefile
@@ -0,0 +1,26 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = beagle_demo
+PROJECT_SOURCES = beagle_demo.c
+PROJECT_SOURCES += beaglebone_leds.c
+PROJECT_SOURCES += static_model.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
+
+LDLIBS += -lm
+
+$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
+
+beagle_client: beagle_client.c $(LIB_NAME)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o beagle_client beagle_client.c $(INCLUDES) $(LIB_NAME) $(LDLIBS)
+
+clean:
+ rm -f $(PROJECT_BINARY_NAME) beagle_client
+
+
diff --git a/demos/beaglebone/beagle_client.c b/demos/beaglebone/beagle_client.c
new file mode 100644
index 0000000..aff7c4c
--- /dev/null
+++ b/demos/beaglebone/beagle_client.c
@@ -0,0 +1,115 @@
+/*
+ * beagle_client.c
+ *
+ * Switch LEDs on the BeagleBone
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+
+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) {
+
+
+ /************************
+ * Direct control
+ ***********************/
+
+ bool led4State = false;
+
+ ControlObjectClient controlLED1
+ = ControlObjectClient_create("beagleGenericIO/GGIO1.SPCSO1", con);
+
+ ControlObjectClient controlLED2
+ = ControlObjectClient_create("beagleGenericIO/GGIO1.SPCSO2", con);
+
+ ControlObjectClient controlLED3
+ = ControlObjectClient_create("beagleGenericIO/GGIO1.SPCSO3", con);
+
+ ControlObjectClient controlLED4
+ = ControlObjectClient_create("beagleGenericIO/GGIO1.DPCSO1", con);
+
+ MmsValue* ctlValOn = MmsValue_newBoolean(true);
+
+ MmsValue* ctlValOff = MmsValue_newBoolean(false);
+
+ if (!ControlObjectClient_operate(controlLED1, ctlValOff, 0)) goto control_error;
+
+ ControlObjectClient_select(controlLED2);
+ if (!ControlObjectClient_operate(controlLED2, ctlValOff, 0)) goto control_error;
+
+ if (!ControlObjectClient_operate(controlLED4, ctlValOff, 0)) goto control_error;
+
+ while (1) {
+ if (!ControlObjectClient_operate(controlLED3, ctlValOff, 0)) goto control_error;
+ if (!ControlObjectClient_operate(controlLED1, ctlValOn, 0)) goto control_error;
+ Thread_sleep(1000);
+
+ if (!ControlObjectClient_operate(controlLED1, ctlValOff, 0)) goto control_error;
+
+ ControlObjectClient_select(controlLED2);
+ if (!ControlObjectClient_operate(controlLED2, ctlValOn, 0)) goto control_error;
+
+ Thread_sleep(1000);
+
+ ControlObjectClient_select(controlLED2);
+ if (!ControlObjectClient_operate(controlLED2, ctlValOff, 0)) goto control_error;
+
+ if (!ControlObjectClient_operate(controlLED3, ctlValOn, 0)) goto control_error;
+ Thread_sleep(1000);
+
+ if (led4State == false) {
+ if (!ControlObjectClient_operate(controlLED4, ctlValOn, 0)) goto control_error;
+ led4State = true;
+ }
+ else {
+ if (!ControlObjectClient_operate(controlLED4, ctlValOff, 0)) goto control_error;
+ led4State = false;
+ }
+ }
+
+ goto exit_control_loop;
+
+control_error:
+ printf("Error controlling device!\n");
+
+exit_control_loop:
+
+ MmsValue_delete(ctlValOn);
+ MmsValue_delete(ctlValOff);
+
+ ControlObjectClient_destroy(controlLED1);
+ ControlObjectClient_destroy(controlLED2);
+ ControlObjectClient_destroy(controlLED3);
+ ControlObjectClient_destroy(controlLED4);
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Connection failed!\n");
+ }
+
+ IedConnection_destroy(con);
+}
+
+
diff --git a/demos/beaglebone/beagle_demo.c b/demos/beaglebone/beagle_demo.c
new file mode 100644
index 0000000..82c1ac0
--- /dev/null
+++ b/demos/beaglebone/beagle_demo.c
@@ -0,0 +1,331 @@
+/*
+ * beagle_demo.c
+ *
+ * This demo shows how to connect the libiec61850 server stack to a real device.
+ *
+ */
+
+#include "iec61850_server.h"
+#include "iso_server.h"
+#include "acse.h"
+#include "hal_thread.h"
+#include
+#include
+#include
+#include
+
+#include "static_model.h"
+
+#include "beaglebone_leds.h"
+
+/* import IEC 61850 device model created from SCL-File */
+extern IedModel iedModel;
+
+static int running = 0;
+static IedServer iedServer = NULL;
+
+static bool automaticOperationMode = true;
+static ClientConnection controllingClient = NULL;
+
+static uint32_t dpcState = 0;
+
+void sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+static void
+connectionIndicationHandler(IedServer server, ClientConnection connection, bool connected, void* parameter)
+{
+ const char* clientAddress = ClientConnection_getPeerAddress(connection);
+
+ if (connected) {
+ printf("BeagleDemoServer: new client connection from %s\n", clientAddress);
+ }
+ else {
+ printf("BeagleDemoServer: client connection from %s closed\n", clientAddress);
+
+ if (controllingClient == connection) {
+ printf("Controlling client has closed connection -> switch to automatic operation mode\n");
+ controllingClient = NULL;
+ automaticOperationMode = true;
+ }
+ }
+}
+
+static CheckHandlerResult
+performCheckHandler(void* parameter, MmsValue* ctlVal, bool test, bool interlockCheck, ClientConnection connection)
+{
+ if (controllingClient == NULL) {
+ printf("Client takes control -> switch to remote control operation mode\n");
+ controllingClient = connection;
+ automaticOperationMode = false;
+ }
+
+ /* test command not accepted if mode is "on" */
+ if (test)
+ return CONTROL_TEMPORARILY_UNAVAILABLE;
+
+ /* If there is already another client that controls the device reject the control attempt */
+ if (controllingClient == connection)
+ return CONTROL_ACCEPTED;
+ else
+ return CONTROL_TEMPORARILY_UNAVAILABLE;
+}
+
+static void
+updateLED1stVal(bool newLedState, uint64_t timeStamp) {
+ switchLED(LED1, newLedState);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);
+ IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, newLedState);
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_q, QUALITY_VALIDITY_GOOD | QUALITY_SOURCE_SUBSTITUTED);
+}
+
+static void
+updateLED2stVal(bool newLedState, uint64_t timeStamp) {
+ switchLED(LED2, newLedState);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);
+ IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, newLedState);
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_q, QUALITY_VALIDITY_QUESTIONABLE | QUALITY_DETAIL_OSCILLATORY);
+}
+
+static void
+updateLED3stVal(bool newLedState, uint64_t timeStamp) {
+ switchLED(LED3, newLedState);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);
+ IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, newLedState);
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_q, QUALITY_VALIDITY_GOOD);
+}
+
+static ControlHandlerResult
+controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test)
+{
+ if (test)
+ return CONTROL_RESULT_OK;
+
+ uint64_t timeStamp = Hal_getTimeInMs();
+
+ bool newState = MmsValue_getBoolean(value);
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1)
+ updateLED1stVal(newState, timeStamp);
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2)
+ updateLED2stVal(newState, timeStamp);
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3)
+ updateLED3stVal(newState, timeStamp);
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_DPCSO1) { /* example for Double Point Control - DPC */
+
+ dpcState = 0; /* DPC_STATE_INTERMEDIATE */
+ IedServer_updateBitStringAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_stVal, dpcState);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_t, timeStamp);
+
+
+ if (newState) {
+ flashLED(LED4);
+ Thread_sleep(3000);
+ switchLED(LED4, 1);
+ dpcState = 2; /* DPC_STATE_ON */
+ }
+ else {
+ flashLED(LED4);
+ Thread_sleep(3000);
+ switchLED(LED4, 0);
+ dpcState = 1; /* DPC_STATE_OFF */
+ }
+
+ IedServer_updateBitStringAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_stVal, dpcState);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_t, timeStamp);
+ }
+
+ return CONTROL_RESULT_OK;
+}
+
+static int ledOnTimeMs = 1000;
+static int ledOffTimeMs = 1000;
+static int32_t opCnt = 0;
+
+static ControlHandlerResult
+controlHandlerForInt32Controls(void* parameter, MmsValue* value, bool test)
+{
+ if (test)
+ return CONTROL_RESULT_OK;
+
+ if (parameter == IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs) {
+ int32_t newValue = MmsValue_toInt32(value);
+
+ opCnt = newValue;
+
+ uint64_t currentTime = Hal_getTimeInMs();
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_t, currentTime);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_stVal, opCnt);
+ }
+
+ return CONTROL_RESULT_OK;
+}
+
+
+
+static MmsDataAccessError
+int32WriteAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnection connection, void* parameter)
+{
+ int newValue = MmsValue_toInt32(value);
+
+ /* Check if value is inside of valid range */
+ if (newValue < 0)
+ return DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID;
+
+ if (dataAttribute == IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_setVal) {
+
+ printf("New value for TIM_GAPC1.OpDlTmms.setVal = %i\n", newValue);
+
+ ledOffTimeMs = newValue;
+
+ return DATA_ACCESS_ERROR_SUCCESS;
+ }
+
+ if (dataAttribute == IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_setVal) {
+
+ printf("New value for TIM_GAPC1.RsDlTmms.setVal = %i\n", newValue);
+
+ ledOnTimeMs = newValue;
+
+ return DATA_ACCESS_ERROR_SUCCESS;
+ }
+
+ return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED;
+}
+
+
+int main(int argc, char** argv) {
+
+ initLEDs();
+
+ iedServer = IedServer_create(&iedModel);
+
+ /* Set control callback handlers */
+ IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionIndicationHandler, NULL);
+
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
+ (ControlPerformCheckHandler) performCheckHandler, IEDMODEL_GenericIO_GGIO1_SPCSO1);
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput,
+ IEDMODEL_GenericIO_GGIO1_SPCSO1);
+
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,
+ (ControlPerformCheckHandler) performCheckHandler, IEDMODEL_GenericIO_GGIO1_SPCSO2);
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, (ControlHandler) controlHandlerForBinaryOutput,
+ IEDMODEL_GenericIO_GGIO1_SPCSO2);
+
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,
+ (ControlPerformCheckHandler) performCheckHandler, IEDMODEL_GenericIO_GGIO1_SPCSO3);
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, (ControlHandler) controlHandlerForBinaryOutput,
+ IEDMODEL_GenericIO_GGIO1_SPCSO3);
+
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1,
+ (ControlPerformCheckHandler) performCheckHandler, IEDMODEL_GenericIO_GGIO1_DPCSO1);
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1, (ControlHandler) controlHandlerForBinaryOutput,
+ IEDMODEL_GenericIO_GGIO1_DPCSO1);
+
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs, (ControlHandler) controlHandlerForInt32Controls,
+ IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs);
+
+ /* Initialize process values */
+ MmsValue* DPCSO1_stVal = IedServer_getAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_DPCSO1_stVal);
+ MmsValue_setBitStringFromInteger(DPCSO1_stVal, 1); /* set DPC to OFF */
+
+ /* Intitalize setting values */
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_setVal, ledOffTimeMs);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_setVal, ledOnTimeMs);
+
+ /* Set callback handler for settings */
+ IedServer_handleWriteAccess(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_setVal, int32WriteAccessHandler, NULL);
+ IedServer_handleWriteAccess(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_setVal, int32WriteAccessHandler, 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;
+
+ bool ledStateValue = false;
+
+ uint64_t nextLedToggleTime = Hal_getTimeInMs() + 1000;
+
+ while (running) {
+ uint64_t currentTime = Hal_getTimeInMs();
+
+ if (automaticOperationMode) {
+ if (nextLedToggleTime <= currentTime) {
+
+
+ if (ledStateValue)
+ nextLedToggleTime = currentTime + ledOffTimeMs;
+ else
+ nextLedToggleTime = currentTime + ledOnTimeMs;
+
+ ledStateValue = !ledStateValue;
+
+ if (ledStateValue) {
+ opCnt++;
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_t, currentTime);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_stVal, opCnt);
+ }
+
+ updateLED1stVal(ledStateValue, currentTime);
+ updateLED2stVal(ledStateValue, currentTime);
+ updateLED3stVal(ledStateValue, currentTime);
+ }
+ }
+
+ t += 0.1f;
+
+ IedServer_lockDataModel(iedServer);
+
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, sinf(t));
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_q, QUALITY_VALIDITY_GOOD);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, currentTime);
+
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, sinf(t + 1.f));
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_q, QUALITY_VALIDITY_GOOD);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, currentTime);
+
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, sinf(t + 2.f));
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_q, QUALITY_VALIDITY_GOOD);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, currentTime);
+
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, sinf(t + 3.f));
+ IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_q, QUALITY_VALIDITY_GOOD);
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, currentTime);
+
+ 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/demos/beaglebone/beagle_demo.icd b/demos/beaglebone/beagle_demo.icd
new file mode 100644
index 0000000..259c21f
--- /dev/null
+++ b/demos/beaglebone/beagle_demo.icd
@@ -0,0 +1,350 @@
+
+
+
+
+
+ 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
+
+
+
+
+ sbo-with-normal-security
+
+
+
+
+ direct-with-normal-security
+
+
+
+
+ direct-with-enhanced-security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EXT:2015
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ direct-with-normal-security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ status-only
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ on
+ blocked
+ test
+ test/blocked
+ off
+
+
+
+ unknown
+ forward
+ backward
+ both
+
+
+
+ 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/demos/beaglebone/beaglebone_leds.c b/demos/beaglebone/beaglebone_leds.c
new file mode 100644
index 0000000..314aa81
--- /dev/null
+++ b/demos/beaglebone/beaglebone_leds.c
@@ -0,0 +1,63 @@
+/*
+ * beaglebone_leds.c
+ */
+
+#include
+#include "beaglebone_leds.h"
+
+#ifndef SIMULATED
+static void
+writeToFile(char* filename, char* text)
+{
+ FILE* file = fopen(filename, "w");
+ fprintf(file, "%s", text);
+ fclose(file);
+}
+#endif /* SIMULATED */
+
+void
+flashLED(char* led)
+{
+#ifndef SIMULATED
+ char filename[255];
+
+ sprintf(filename, "%s/trigger", led);
+ writeToFile(filename, "timer");
+
+ sprintf(filename, "%s/delay_on", led);
+ writeToFile(filename, "200");
+
+ sprintf(filename, "%s/delay_off", led);
+ writeToFile(filename, "200");
+#else
+ printf("FLASH: %s\n", led);
+#endif
+}
+
+void
+switchLED(char* led, int value)
+{
+#ifndef SIMULATED
+ char filename[255];
+ char valueStr[10];
+
+ sprintf(filename, "%s/trigger", led);
+ writeToFile(filename, "none");
+
+ sprintf(filename, "%s/brightness", led);
+ sprintf(valueStr, "%i", value);
+
+ writeToFile(filename, valueStr);
+#else
+ printf("SWITCH: %s %i\n", led, value);
+#endif
+}
+
+void
+initLEDs()
+{
+ switchLED(LED1, 0);
+ switchLED(LED2, 0);
+ switchLED(LED3, 0);
+ switchLED(LED4, 0);
+}
diff --git a/demos/beaglebone/beaglebone_leds.h b/demos/beaglebone/beaglebone_leds.h
new file mode 100644
index 0000000..61a396c
--- /dev/null
+++ b/demos/beaglebone/beaglebone_leds.h
@@ -0,0 +1,38 @@
+/*
+ * beaglebone_leds.h
+ */
+
+#ifndef BEAGLEBONE_LEDS_H_
+#define BEAGLEBONE_LEDS_H_
+
+
+/* set to 1 if you want to run the demo on a PC */
+//#define SIMULATED 1
+
+
+
+/* select correct file paths to access LEDs - depends on beaglebones linux distro/version */
+#if 0
+#define LED1 "/sys/class/leds/beaglebone::usr0"
+#define LED2 "/sys/class/leds/beaglebone::usr1"
+#define LED3 "/sys/class/leds/beaglebone::usr2"
+#define LED4 "/sys/class/leds/beaglebone::usr3"
+#endif
+
+#if 1
+#define LED1 "/sys/class/leds/beaglebone:green:usr0"
+#define LED2 "/sys/class/leds/beaglebone:green:usr1"
+#define LED3 "/sys/class/leds/beaglebone:green:usr2"
+#define LED4 "/sys/class/leds/beaglebone:green:usr3"
+#endif
+
+void
+flashLED(char* led);
+
+void
+switchLED(char* led, int value);
+
+void
+initLEDs();
+
+#endif /* BEAGLEBONE_LEDS_H_ */
diff --git a/demos/beaglebone/static_model.c b/demos/beaglebone/static_model.c
new file mode 100644
index 0000000..993db3e
--- /dev/null
+++ b/demos/beaglebone/static_model.c
@@ -0,0 +1,2439 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from beagle_demo.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$DPCSO1$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_Beh,
+};
+
+DataObject iedModel_GenericIO_LLN0_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_GenericIO_LLN0,
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ (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,
+ ENUMERATED,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_LLN0_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_GenericIO_LLN0,
+ (ModelNode*) &iedModel_GenericIO_LLN0_Health,
+ (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,
+ ENUMERATED,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 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,
+ ENUMERATED,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_GenericIO_GGIO1 = {
+ LogicalNodeModelType,
+ "GGIO1",
+ (ModelNode*) &iedModel_GenericIO,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Beh,
+};
+
+DataObject iedModel_GenericIO_GGIO1_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ (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,
+ ENUMERATED,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Health,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_stVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 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,
+ ENUMERATED,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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_SBO,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO = {
+ DataAttributeModelType,
+ "SBO",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ VISIBLE_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO3 = {
+ DataObjectModelType,
+ "SPCSO3",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ (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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_DPCSO1 = {
+ DataObjectModelType,
+ "DPCSO1",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_stVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ CODEDENUM,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_ctlModel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1_t,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_DPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_GenericIO_TIM_GAPC1 = {
+ LogicalNodeModelType,
+ "TIM_GAPC1",
+ (ModelNode*) &iedModel_GenericIO,
+ NULL,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh,
+};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh_stVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Beh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod_stVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_Str = {
+ DataObjectModelType,
+ "Str",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str_general,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_general = {
+ DataAttributeModelType,
+ "general",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str_dirGeneral,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_dirGeneral = {
+ DataAttributeModelType,
+ "dirGeneral",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Str,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_Op = {
+ DataObjectModelType,
+ "Op",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpDlTmms,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op_general,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_general = {
+ DataAttributeModelType,
+ "general",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_Op,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_OpDlTmms = {
+ DataObjectModelType,
+ "OpDlTmms",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_RsDlTmms,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpDlTmms_setVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpDlTmms,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs,
+ NULL,
+ 0,
+ IEC61850_FC_SP,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs = {
+ DataAttributeModelType,
+ "dataNs",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpDlTmms,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_EX,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_RsDlTmms = {
+ DataObjectModelType,
+ "RsDlTmms",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_RsDlTmms_setVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_RsDlTmms,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs,
+ NULL,
+ 0,
+ IEC61850_FC_SP,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs = {
+ DataAttributeModelType,
+ "dataNs",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_RsDlTmms,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_EX,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_TIM_GAPC1_OpCntRs = {
+ DataObjectModelType,
+ "OpCntRs",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1,
+ NULL,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_stVal,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_TIM_GAPC1_OpCntRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 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;
+
+ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1};
+ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCB02", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2};
+ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsRCB03", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3};
+ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsRCB04", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4};
+ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsRCB05", "Events1", false, "Events", 1, 24, 111, 50, 1000, NULL};
+
+
+
+
+IedModel iedModel = {
+ "beagle",
+ &iedModel_GenericIO,
+ &iedModelds_GenericIO_LLN0_Events,
+ &iedModel_GenericIO_LLN0_report0,
+ 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(2);
+
+iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1);
+
+iedModel_GenericIO_GGIO1_DPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(3);
+
+iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
+
+iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs.mmsValue = MmsValue_newVisibleString("EXT:2015");
+
+iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs.mmsValue = MmsValue_newVisibleString("EXT:2015");
+
+iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1);
+}
diff --git a/demos/beaglebone/static_model.h b/demos/beaglebone/static_model.h
new file mode 100644
index 0000000..a50ade8
--- /dev/null
+++ b/demos/beaglebone/static_model.h
@@ -0,0 +1,399 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from beagle_demo.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_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_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_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_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_Mod;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_stVal;
+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_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_SBO;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test;
+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_DPCSO1;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_DPCSO1_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind1;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind2;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind3;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind4;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
+extern LogicalNode iedModel_GenericIO_TIM_GAPC1;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_Beh;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_q;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Beh_t;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_Mod;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_stVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_q;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_t;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_Str;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_general;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_dirGeneral;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_q;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Str_t;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_Op;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_general;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_q;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_Op_t;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_OpDlTmms;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_setVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_RsDlTmms;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_setVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs;
+extern DataObject iedModel_GenericIO_TIM_GAPC1_OpCntRs;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_stVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_q;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_t;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_T;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check;
+extern DataAttribute iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel;
+
+
+
+#define IEDMODEL_GenericIO (&iedModel_GenericIO)
+#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0)
+#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_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_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_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_Mod (&iedModel_GenericIO_GGIO1_Mod)
+#define IEDMODEL_GenericIO_GGIO1_Mod_stVal (&iedModel_GenericIO_GGIO1_Mod_stVal)
+#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_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_SBO (&iedModel_GenericIO_GGIO1_SPCSO2_SBO)
+#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_Cancel (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test)
+#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_DPCSO1 (&iedModel_GenericIO_GGIO1_DPCSO1)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_stVal (&iedModel_GenericIO_GGIO1_DPCSO1_stVal)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_q (&iedModel_GenericIO_GGIO1_DPCSO1_q)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper (&iedModel_GenericIO_GGIO1_DPCSO1_Oper)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_DPCSO1_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_DPCSO1_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_DPCSO1_t (&iedModel_GenericIO_GGIO1_DPCSO1_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)
+#define IEDMODEL_GenericIO_TIM_GAPC1 (&iedModel_GenericIO_TIM_GAPC1)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Beh (&iedModel_GenericIO_TIM_GAPC1_Beh)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Beh_stVal (&iedModel_GenericIO_TIM_GAPC1_Beh_stVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Beh_q (&iedModel_GenericIO_TIM_GAPC1_Beh_q)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Beh_t (&iedModel_GenericIO_TIM_GAPC1_Beh_t)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Mod (&iedModel_GenericIO_TIM_GAPC1_Mod)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Mod_stVal (&iedModel_GenericIO_TIM_GAPC1_Mod_stVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Mod_q (&iedModel_GenericIO_TIM_GAPC1_Mod_q)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Mod_t (&iedModel_GenericIO_TIM_GAPC1_Mod_t)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Mod_ctlModel (&iedModel_GenericIO_TIM_GAPC1_Mod_ctlModel)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Str (&iedModel_GenericIO_TIM_GAPC1_Str)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Str_general (&iedModel_GenericIO_TIM_GAPC1_Str_general)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Str_dirGeneral (&iedModel_GenericIO_TIM_GAPC1_Str_dirGeneral)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Str_q (&iedModel_GenericIO_TIM_GAPC1_Str_q)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Str_t (&iedModel_GenericIO_TIM_GAPC1_Str_t)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Op (&iedModel_GenericIO_TIM_GAPC1_Op)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Op_general (&iedModel_GenericIO_TIM_GAPC1_Op_general)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Op_q (&iedModel_GenericIO_TIM_GAPC1_Op_q)
+#define IEDMODEL_GenericIO_TIM_GAPC1_Op_t (&iedModel_GenericIO_TIM_GAPC1_Op_t)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms (&iedModel_GenericIO_TIM_GAPC1_OpDlTmms)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_setVal (&iedModel_GenericIO_TIM_GAPC1_OpDlTmms_setVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpDlTmms_dataNs (&iedModel_GenericIO_TIM_GAPC1_OpDlTmms_dataNs)
+#define IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms (&iedModel_GenericIO_TIM_GAPC1_RsDlTmms)
+#define IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_setVal (&iedModel_GenericIO_TIM_GAPC1_RsDlTmms_setVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_RsDlTmms_dataNs (&iedModel_GenericIO_TIM_GAPC1_RsDlTmms_dataNs)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs (&iedModel_GenericIO_TIM_GAPC1_OpCntRs)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_stVal (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_stVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_q (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_q)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_t (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_t)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlVal)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_ctlNum)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_T (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_T)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Test)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_Oper_Check)
+#define IEDMODEL_GenericIO_TIM_GAPC1_OpCntRs_ctlModel (&iedModel_GenericIO_TIM_GAPC1_OpCntRs_ctlModel)
+
+#endif /* STATIC_MODEL_H_ */
+
diff --git a/dotnet/IEC61850forCSharp/AssemblyInfo.cs b/dotnet/IEC61850forCSharp/AssemblyInfo.cs
new file mode 100644
index 0000000..479370f
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("IEC61850 API for C#")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("MZ Automation GmbH")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Michael Zillgith")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/IEC61850forCSharp/Control.cs b/dotnet/IEC61850forCSharp/Control.cs
new file mode 100644
index 0000000..cd425d8
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/Control.cs
@@ -0,0 +1,422 @@
+/*
+ * Control.cs
+ *
+ * Copyright 2014 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.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+using IEC61850.Common;
+
+namespace IEC61850
+{
+
+ ///
+ /// IEC 61850 common API parts (used by client and server API)
+ ///
+ namespace Common {
+
+ ///
+ /// Control model
+ ///
+ public enum ControlModel
+ {
+ /** status only */
+ STATUS_ONLY = 0,
+ /** direct with normal security */
+ DIRECT_NORMAL= 1,
+ /** select before operate (SBO) with normal security */
+ SBO_NORMAL = 2,
+ /** direct with enhanced security */
+ DIRECT_ENHANCED = 3,
+ /** select before operate (SBO) with enhanced security */
+ SBO_ENHANCED = 4
+ }
+
+ ///
+ /// Originator category
+ ///
+ public enum OrCat {
+ /** Not supported - should not be used */
+ NOT_SUPPORTED = 0,
+ /** Control operation issued from an operator using a client located at bay level */
+ BAY_CONTROL = 1,
+ /** Control operation issued from an operator using a client located at station level */
+ STATION_CONTROL = 2,
+ /** Control operation from a remote operator outside the substation (for example network control center) */
+ REMOTE_CONTROL = 3,
+ /** Control operation issued from an automatic function at bay level */
+ AUTOMATIC_BAY = 4,
+ /** Control operation issued from an automatic function at station level */
+ AUTOMATIC_STATION = 5,
+ /** Control operation issued from a automatic function outside of the substation */
+ AUTOMATIC_REMOTE = 6,
+ /** Control operation issued from a maintenance/service tool */
+ MAINTENANCE = 7,
+ /** Status change occurred without control action (for example external trip of a circuit breaker or failure inside the breaker) */
+ PROCESS = 8
+ }
+ }
+
+ namespace Client {
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct LastApplErrorInternal
+ {
+ public int ctlNum;
+ public int error;
+ public int addCause;
+ }
+
+ public class LastApplError
+ {
+ public int ctlNum;
+ public int error;
+ public ControlAddCause addCause;
+
+
+ internal LastApplError (LastApplErrorInternal lastApplError)
+ {
+ this.addCause = (ControlAddCause) lastApplError.addCause;
+ this.error = lastApplError.error;
+ this.ctlNum = lastApplError.ctlNum;
+ }
+ }
+
+ ///
+ /// Control object.
+ ///
+ public class ControlObject
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern IntPtr ControlObjectClient_create(string objectReference, IntPtr connection);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void ControlObjectClient_destroy(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern int ControlObjectClient_getControlModel(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ private static extern bool ControlObjectClient_operate(IntPtr self, IntPtr ctlVal, UInt64 operTime);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ private static extern bool ControlObjectClient_select(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ private static extern bool ControlObjectClient_selectWithValue(IntPtr self, IntPtr ctlVal);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ private static extern bool ControlObjectClient_cancel(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void ControlObjectClient_setOrigin(IntPtr self, string orIdent, int orCat);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void ControlObjectClient_enableInterlockCheck(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void ControlObjectClient_enableSynchroCheck(IntPtr self);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ private delegate void InternalCommandTerminationHandler(IntPtr parameter,IntPtr controlClient);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void ControlObjectClient_setCommandTerminationHandler(IntPtr self,
+ InternalCommandTerminationHandler handler, IntPtr handlerParameter);
+
+ public delegate void CommandTerminationHandler (Object parameter, ControlObject controlObject);
+
+ private IedConnection iedConnection;
+ private IntPtr controlObject;
+
+ private CommandTerminationHandler commandTerminationHandler = null;
+ private Object commandTerminationHandlerParameter = null;
+
+ private void MyCommandTerminationHandler (IntPtr paramter, IntPtr controlClient)
+ {
+ if (commandTerminationHandler != null)
+ commandTerminationHandler(commandTerminationHandlerParameter, this);
+ }
+
+ private InternalCommandTerminationHandler intCommandTerminationHandler;
+
+ internal ControlObject (string objectReference, IntPtr connection, IedConnection iedConnection)
+ {
+ this.iedConnection = iedConnection;
+
+ this.controlObject = ControlObjectClient_create(objectReference, connection);
+
+ if (this.controlObject == System.IntPtr.Zero)
+ throw new IedConnectionException("Control object not found", 0);
+
+ intCommandTerminationHandler = new InternalCommandTerminationHandler (MyCommandTerminationHandler);
+
+ ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject);
+ }
+
+ ~ControlObject ()
+ {
+ if (this.controlObject != System.IntPtr.Zero)
+ ControlObjectClient_destroy(controlObject);
+ }
+
+ ///
+ /// Gets the control model.
+ ///
+ ///
+ /// The control model.
+ ///
+ public ControlModel GetControlModel ()
+ {
+ ControlModel controlModel = (ControlModel) ControlObjectClient_getControlModel(controlObject);
+
+ return controlModel;
+ }
+
+ ///
+ /// Sets the origin parameter used by control commands.
+ ///
+ ///
+ /// Originator. An arbitrary string identifying the controlling client.
+ ///
+ ///
+ /// Originator category.
+ ///
+ public void SetOrigin (string originator, OrCat originatorCategory)
+ {
+ ControlObjectClient_setOrigin(controlObject, originator, (int) originatorCategory);
+ }
+
+ ///
+ /// Operate the control with the specified control value.
+ ///
+ /// the new value of the control
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (bool ctlVal)
+ {
+ return Operate (ctlVal, 0);
+ }
+
+ ///
+ /// Operate the control with the specified control value (time activated control).
+ ///
+ /// the new value of the control
+ /// the time when the operation will be executed
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (bool ctlVal, UInt64 operTime)
+ {
+ MmsValue value = new MmsValue(ctlVal);
+
+ return Operate (value, operTime);
+ }
+
+ ///
+ /// Operate the control with the specified control value.
+ ///
+ /// the new value of the control
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (float ctlVal)
+ {
+ return Operate (ctlVal, 0);
+ }
+
+ ///
+ /// Operate the control with the specified control value (time activated control).
+ ///
+ /// the new value of the control
+ /// the time when the operation will be executed
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (float ctlVal, UInt64 operTime)
+ {
+ MmsValue value = new MmsValue(ctlVal);
+
+ return Operate (value, operTime);
+ }
+
+ ///
+ /// Operate the control with the specified control value.
+ ///
+ /// the new value of the control
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (int ctlVal)
+ {
+ return Operate (ctlVal, 0);
+ }
+
+ ///
+ /// Operate the control with the specified control value (time activated control).
+ ///
+ /// the new value of the control
+ /// the time when the operation will be executed
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (int ctlVal, UInt64 operTime)
+ {
+ MmsValue value = new MmsValue(ctlVal);
+
+ return Operate (value, operTime);
+ }
+
+ ///
+ /// Operate the control with the specified control value.
+ ///
+ /// the new value of the control
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (MmsValue ctlVal)
+ {
+ return Operate (ctlVal, 0);
+ }
+
+ ///
+ /// Operate the control with the specified control value (time activated control).
+ ///
+ /// the new value of the control
+ /// the time when the operation will be executed
+ /// true when the operation has been successful, false otherwise
+ public bool Operate (MmsValue ctlVal, UInt64 operTime)
+ {
+ return ControlObjectClient_operate(controlObject, ctlVal.valueReference, operTime);
+ }
+
+ ///
+ /// Select the control object.
+ ///
+ /// true when the selection has been successful, false otherwise
+ public bool Select ()
+ {
+ return ControlObjectClient_select(controlObject);
+ }
+
+
+ ///
+ /// Send a select with value command for generic MmsValue instances
+ ///
+ ///
+ /// the value to be checked.
+ ///
+ /// true when the selection has been successful, false otherwise
+ public bool SelectWithValue (MmsValue ctlVal)
+ {
+ return ControlObjectClient_selectWithValue(controlObject, ctlVal.valueReference);
+ }
+
+ ///
+ /// Send a select with value command for boolean controls
+ ///
+ ///
+ /// the value to be checked.
+ ///
+ /// true when the selection has been successful, false otherwise
+ public bool SelectWithValue (bool ctlVal)
+ {
+ return SelectWithValue(new MmsValue(ctlVal));
+ }
+
+ ///
+ /// Send a select with value command for integer controls
+ ///
+ ///
+ /// the value to be checked.
+ ///
+ /// true when the selection has been successful, false otherwise
+ public bool SelectWithValue (int ctlVal)
+ {
+ return SelectWithValue(new MmsValue(ctlVal));
+ }
+
+ ///
+ /// Send a select with value command for float controls
+ ///
+ ///
+ /// the value to be checked.
+ ///
+ /// true when the selection has been successful, false otherwise
+ public bool SelectWithValue (float ctlVal)
+ {
+ return SelectWithValue(new MmsValue(ctlVal));
+ }
+
+ ///
+ /// Cancel a selection or time activated operation
+ ///
+ /// true when the cancelation has been successful, false otherwise
+ public bool Cancel ()
+ {
+ return ControlObjectClient_cancel(controlObject);
+ }
+
+ ///
+ /// Enables the synchro check for operate commands
+ ///
+ public void EnableSynchroCheck ()
+ {
+ ControlObjectClient_enableSynchroCheck(controlObject);
+ }
+
+ ///
+ /// Enables the interlock check for operate and select commands
+ ///
+ public void EnableInterlockCheck ()
+ {
+ ControlObjectClient_enableInterlockCheck(controlObject);
+ }
+
+ ///
+ /// Gets the last received LastApplError (Additional Cause Diagnostics) value.
+ ///
+ ///
+ /// The last appl error.
+ ///
+ public LastApplError GetLastApplError ()
+ {
+ LastApplErrorInternal lastApplError = ControlObjectClient_getLastApplError(controlObject);
+
+ return new LastApplError(lastApplError);
+ }
+
+ ///
+ /// Sets the command termination handler.
+ ///
+ ///
+ /// the handler (delegate) that is invoked when a CommandTerminationMessage is received.
+ ///
+ ///
+ /// Parameter.
+ ///
+ public void SetCommandTerminationHandler (CommandTerminationHandler handler, Object parameter)
+ {
+ this.commandTerminationHandler = handler;
+ this.commandTerminationHandlerParameter = parameter;
+ }
+
+ }
+
+ }
+
+}
+
diff --git a/dotnet/IEC61850forCSharp/DataSet.cs b/dotnet/IEC61850forCSharp/DataSet.cs
new file mode 100644
index 0000000..c0c887e
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/DataSet.cs
@@ -0,0 +1,122 @@
+/*
+ * DataSet.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+
+using System.Runtime.InteropServices;
+
+using IEC61850.Common;
+
+namespace IEC61850
+{
+ namespace Client
+ {
+ ///
+ /// This class is used to represent a data set. It is used to store the values
+ /// of a data set.
+ ///
+ public class DataSet
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientDataSet_destroy (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientDataSet_getValues (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientDataSet_getReference (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int ClientDataSet_getDataSetSize (IntPtr self);
+
+ private IntPtr nativeObject;
+ private MmsValue values = null;
+ private string reference = null;
+
+ internal DataSet (IntPtr nativeObject)
+ {
+ this.nativeObject = nativeObject;
+ }
+
+ ///
+ /// Gets the object reference of the data set
+ ///
+ ///
+ /// object reference.
+ ///
+ public string GetReference ()
+ {
+ if (reference == null) {
+ IntPtr nativeString = ClientDataSet_getReference (nativeObject);
+
+ reference = Marshal.PtrToStringAnsi (nativeString);
+ }
+
+ return reference;
+ }
+
+ ///
+ /// Gets the values associated with the data set object
+ ///
+ /// This function will return the locally stored values associated with the data set.
+ /// These are the values received by the last request to the server. A call to this method doesn't
+ /// invoke a request to the server!
+ ///
+ /// The locally stored values of the data set (as MmsValue instance of type MMS_ARRAY)
+ ///
+ public MmsValue GetValues ()
+ {
+ if (values == null) {
+ IntPtr nativeValues = ClientDataSet_getValues (nativeObject);
+
+ values = new MmsValue (nativeValues, false);
+ }
+
+ return values;
+ }
+
+
+ ///
+ /// Gets the number of elements of the data set
+ ///
+ ///
+ /// the number of elementes (data set members)
+ ///
+ public int GetSize ()
+ {
+ return ClientDataSet_getDataSetSize (nativeObject);
+ }
+
+ ~DataSet ()
+ {
+ ClientDataSet_destroy (nativeObject);
+ }
+
+ internal IntPtr getNativeInstance ()
+ {
+ return nativeObject;
+ }
+ }
+
+ }
+
+}
diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs
new file mode 100644
index 0000000..3c58197
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs
@@ -0,0 +1,1414 @@
+/*
+ * IEC61850ClientAPI.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Collections;
+
+using IEC61850.Common;
+
+///
+/// IEC 61850 API for the libiec61850 .NET wrapper library
+///
+namespace IEC61850
+{
+ ///
+ /// IEC 61850 client API.
+ ///
+ namespace Client
+ {
+
+ [StructLayout(LayoutKind.Sequential)]
+ public class MmsServerIdentity
+ {
+ public string vendorName;
+ public string modelName;
+ public string revision;
+ }
+
+ public class MmsConnection
+ {
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern IntPtr MmsConnection_create();
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern void MmsConnection_destroy(IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern IntPtr MmsConnection_identify(IntPtr self, out int mmsError);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern void MmsServerIdentity_destroy(IntPtr self);
+
+ private IntPtr self = IntPtr.Zero;
+ private bool selfDestroy = false;
+
+ public MmsConnection() {
+ selfDestroy = true;
+
+ self = MmsConnection_create();
+ }
+
+ internal MmsConnection(IntPtr mmsConnection) {
+ self = mmsConnection;
+ }
+
+ ~MmsConnection ()
+ {
+ if (selfDestroy)
+ if (self != IntPtr.Zero)
+ MmsConnection_destroy(self);
+ }
+
+ public MmsServerIdentity GetServerIdentity ()
+ {
+ int mmsError;
+
+ if (self == IntPtr.Zero) {
+ throw new IedConnectionException("Pointer is Zero!");
+ }
+
+ IntPtr identity = MmsConnection_identify(self, out mmsError);
+
+ MmsServerIdentity serverIdentity = (MmsServerIdentity)
+ Marshal.PtrToStructure(identity, typeof(MmsServerIdentity));
+
+ MmsServerIdentity_destroy(identity);
+
+ return serverIdentity;
+ }
+
+ }
+
+ ///
+ /// This class acts as the entry point for the IEC 61850 client API. It represents a single
+ /// (MMS) connection to a server.
+ ///
+ public partial class IedConnection
+ {
+ /*************
+ * MmsValue
+ *************/
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_toString (IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern float MmsValue_toFloat (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool MmsValue_getBoolean (IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern UInt32 MmsValue_getBitStringAsInteger (IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern int MmsValue_getType (IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void MmsValue_delete (IntPtr self);
+
+ /****************
+ * IedConnection
+ ***************/
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_create ();
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void IedConnection_destroy (IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void IedConnection_setConnectTimeout(IntPtr self, UInt32 timeoutInMs);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void IedConnection_connect (IntPtr self, out int error, string hostname, int tcpPort);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void IedConnection_abort (IntPtr self, out int error);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern void IedConnection_release(IntPtr self, out int error);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ private static extern void IedConnection_close(IntPtr self);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_readObject (IntPtr self, out int error, string objectReference, int fc);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern void IedConnection_writeObject (IntPtr self, out int error, string dataAttributeReference, int fc, IntPtr value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getDataDirectory (IntPtr self, out int error, string dataReference);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getDataDirectoryByFC (IntPtr self, out int error, string dataReference, FunctionalConstraint fc);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getDataDirectoryFC (IntPtr self, out int error, string dataReference);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getLogicalNodeDirectory (IntPtr self, out int error, string logicalNodeReference, int acsiClass);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getServerDirectory (IntPtr self, out int error, bool getFileNames);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_getDeviceModelFromServer(IntPtr self, out int error);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getLogicalDeviceDirectory (IntPtr self, out int error, string logicalDeviceName);
+
+ [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getVariableSpecification(IntPtr self, out int error, string objectReference, int fc);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ private delegate void InternalConnectionClosedHandler (IntPtr parameter,IntPtr Iedconnection);
+
+ public delegate void ConnectionClosedHandler (IedConnection connection);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_installConnectionClosedHandler (IntPtr self, InternalConnectionClosedHandler handler, IntPtr parameter);
+
+ [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 IntPtr IedConnection_createDataSet (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_deleteDataSet (IntPtr self, out int error, string dataSetReference);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getDataSetDirectory(IntPtr self, out int error, string dataSetReference, [MarshalAs(UnmanagedType.I1)] out bool isDeletable);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getMmsConnection (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsConnection_getIsoConnectionParameters(IntPtr mmsConnection);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getFileDirectory(IntPtr self, out int error, string directoryName);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_deleteFile(IntPtr self, out int error, string fileName);
+
+ /********************
+ * FileDirectoryEntry
+ *********************/
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void FileDirectoryEntry_destroy(IntPtr self);
+
+ /****************
+ * LinkedList
+ ***************/
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr LinkedList_getNext (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr LinkedList_getData (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void LinkedList_destroy (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void LinkedList_destroyStatic(IntPtr self);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ private delegate void LinkedListValueDeleteFunction(IntPtr pointer);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void LinkedList_destroyDeep(IntPtr list, LinkedListValueDeleteFunction valueDeleteFunction);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr LinkedList_create ();
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void LinkedList_add (IntPtr self, IntPtr data);
+
+ private IntPtr connection = IntPtr.Zero;
+ private InternalConnectionClosedHandler connectionClosedHandler;
+ private ConnectionClosedHandler userProvidedHandler = null;
+
+ public IedConnection ()
+ {
+ connection = IedConnection_create ();
+ }
+
+ ///
+ /// Releases all resource used by the object.
+ ///
+ /// Call when you are finished using the . The
+ /// method leaves the in an unusable state. After
+ /// calling , you must release all references to the
+ /// so the garbage collector can reclaim the memory that the was occupying.
+ public void Dispose()
+ {
+ if (connection != IntPtr.Zero) {
+ cleanupRCBs ();
+
+ IedConnection_destroy (connection);
+
+ connection = IntPtr.Zero;
+ }
+ }
+
+ ~IedConnection ()
+ {
+ if (connection != IntPtr.Zero) {
+ cleanupRCBs ();
+
+ IedConnection_destroy (connection);
+ }
+ }
+
+ public IsoConnectionParameters GetConnectionParameters ()
+ {
+ IntPtr mmsConnection = IedConnection_getMmsConnection(connection);
+
+ IntPtr parameters = MmsConnection_getIsoConnectionParameters(mmsConnection);
+
+ return new IsoConnectionParameters(parameters);
+ }
+
+ private void FreeHGlobaleDeleteFunction (IntPtr pointer)
+ {
+ Marshal.FreeHGlobal(pointer);
+ }
+
+
+ private UInt32 connectTimeout = 10000;
+
+ public UInt32 ConnectTimeout {
+ get {
+ return connectTimeout;
+ }
+ set {
+ connectTimeout = value;
+ }
+ }
+
+
+ public MmsConnection GetMmsConnection ()
+ {
+ IntPtr mmsConnectionPtr = IedConnection_getMmsConnection(connection);
+
+ return new MmsConnection(mmsConnectionPtr);
+ }
+
+ /// Establish an MMS connection to a server
+ /// This exception is thrown if there is a connection or service error
+ public void Connect (string hostname, int tcpPort)
+ {
+ int error;
+
+ IedConnection_setConnectTimeout(connection, connectTimeout);
+
+ IedConnection_connect (connection, out error, hostname, tcpPort);
+
+ if (error != 0)
+ throw new IedConnectionException ("Connect to " + hostname + ":" + tcpPort + " failed", error);
+ }
+
+ /// Establish an MMS connection to a server.
+ /// This exception is thrown if there is a connection or service error.
+ public void Connect (string hostname)
+ {
+ Connect (hostname, 102);
+ }
+
+ /// This exception is thrown if there is a connection or service error
+ public ControlObject CreateControlObject (string objectReference)
+ {
+ ControlObject controlObject = new ControlObject (objectReference, connection, this);
+
+ return controlObject;
+ }
+
+ public void UpdateDeviceModel()
+ {
+ int error;
+
+ IedConnection_getDeviceModelFromServer(connection, out error);
+
+ if (error != 0)
+ throw new IedConnectionException("UpdateDeviceModel failed", error);
+ }
+
+ /// This exception is thrown if there is a connection or service error
+ public List GetServerDirectory (bool fileDirectory = false)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getServerDirectory (connection, out error, fileDirectory);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetDeviceDirectory failed", error);
+
+ List newList = new List ();
+
+ if (fileDirectory == false) {
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ while (element != IntPtr.Zero) {
+ string ld = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (ld);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+ }
+ else {
+
+ IntPtr element = LinkedList_getNext(linkedList);
+
+ while (element != IntPtr.Zero)
+ {
+ IntPtr elementData = LinkedList_getData(element);
+
+ FileDirectoryEntry entry = new FileDirectoryEntry(elementData);
+
+ newList.Add(entry.GetFileName());
+
+ FileDirectoryEntry_destroy(elementData);
+
+ element = LinkedList_getNext(element);
+ }
+
+ LinkedList_destroyStatic(linkedList);
+ }
+
+ return newList;
+ }
+
+ /// This exception is thrown if there is a connection or service error
+ public List GetLogicalDeviceDirectory (string logicalDeviceName)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getLogicalDeviceDirectory (connection, out error, logicalDeviceName);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetLogicalDeviceDirectory failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string ln = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (ln);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+
+ /// Get the directory of a logical node (LN)
+ /// This function returns the directory contents of a LN. Depending on the provided ACSI class
+ /// The function returns either data object references, or references of other objects like data sets,
+ /// report control blocks, ...
+ /// The object reference of a DO, SDO, or DA.
+ /// the ACSI class of the requested directory elements.
+ /// This exception is thrown if there is a connection or service error
+ public List GetLogicalNodeDirectory (string logicalNodeName, ACSIClass acsiClass)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getLogicalNodeDirectory (connection, out error, logicalNodeName, (int)acsiClass);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetLogicalNodeDirectory failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string dataObject = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (dataObject);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+
+ /// Get a list of attributes (with functional constraints) of a DO, SDO, or DA
+ /// The object reference of a DO, SDO, or DA.
+ /// This exception is thrown if there is a connection or service error
+ public List GetDataDirectory (string dataReference)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getDataDirectory (connection, out error, dataReference);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetDataDirectory failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string dataObject = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (dataObject);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+
+ /// Get the list of attributes with the specified FC of a DO, SDO, or DA
+ /// The object reference of a DO, SDO, or DA.
+ /// Functional constraint
+ /// This exception is thrown if there is a connection or service error
+ public List GetDataDirectory (string dataReference, FunctionalConstraint fc)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getDataDirectoryByFC (connection, out error, dataReference, fc);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetDataDirectory failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string dataObject = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (dataObject);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+
+ /// Get a list of attributes (with functional constraints) of a DO, SDO, or DA
+ /// This function is similar to the GetDataDirectory except that the returned element names
+ /// have the functional contraint (FC) appended.
+ /// The object reference of a DO, SDO, or DA.
+ /// This exception is thrown if there is a connection or service error
+ public List GetDataDirectoryFC (string dataReference)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getDataDirectoryFC (connection, out error, dataReference);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetDataDirectoryFC failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string dataObject = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (dataObject);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+
+
+ /// Read the variable specification (type description of a DA or FDCO
+ /// 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
+ public MmsVariableSpecification GetVariableSpecification (string objectReference, FunctionalConstraint fc)
+ {
+ int error;
+
+ IntPtr varSpecPtr = IedConnection_getVariableSpecification(connection, out error, objectReference, (int) fc);
+
+ if (error != 0)
+ throw new IedConnectionException ("GetVariableSpecification failed", error);
+
+ return new MmsVariableSpecification(varSpecPtr, true);
+ }
+
+ private IntPtr readObjectInternal (string objectReference, FunctionalConstraint fc)
+ {
+ int error;
+
+ IntPtr mmsValue = IedConnection_readObject (connection, out error, objectReference, (int)fc);
+
+ if (error != 0)
+ throw new IedConnectionException ("Reading value failed", error);
+
+ if (mmsValue.ToInt32 () == 0)
+ throw new IedConnectionException ("Variable not found on server", error);
+
+ return mmsValue;
+ }
+
+ /// Read the value of a data attribute (DA) or functional constraint data object (FCDO).
+ /// The object reference of a DA or FCDO.
+ /// The functional constraint (FC) of the object
+ /// the received value as an MmsValue instance
+ /// This exception is thrown if there is a connection or service error
+ public MmsValue ReadValue (String objectReference, FunctionalConstraint fc)
+ {
+ var value = readObjectInternal (objectReference, fc);
+
+ return new MmsValue (value, true);
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type boolean.
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// the received boolean value
+ /// This exception is thrown if there is a connection or service error
+ public bool ReadBooleanValue (string objectReference, FunctionalConstraint fc)
+ {
+ var mmsValue = ReadValue (objectReference, fc);
+
+ if (mmsValue.GetType () == MmsType.MMS_BOOLEAN)
+ return mmsValue.GetBoolean ();
+ else
+ throw new IedConnectionException ("Result is not of type timestamp (MMS_UTC_TIME)", 0);
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type float.
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public float ReadFloatValue (string objectReference, FunctionalConstraint fc)
+ {
+ IntPtr mmsValue = readObjectInternal (objectReference, fc);
+
+ if (MmsValue_getType (mmsValue) != (int)MmsType.MMS_FLOAT)
+ throw new IedConnectionException ("Result is not of type float", 0);
+
+ float value = MmsValue_toFloat (mmsValue);
+
+ MmsValue_delete (mmsValue);
+
+ return value;
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type string (VisibleString or MmsString).
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public string ReadStringValue (string objectReference, FunctionalConstraint fc)
+ {
+ IntPtr mmsValue = readObjectInternal (objectReference, fc);
+
+ if (!((MmsValue_getType (mmsValue) == (int)MmsType.MMS_VISIBLE_STRING) || (MmsValue_getType (mmsValue) == (int)MmsType.MMS_STRING))) {
+ MmsValue_delete (mmsValue);
+ throw new IedConnectionException ("Result is not of type string", 0);
+ }
+
+ IntPtr ptr = MmsValue_toString (mmsValue);
+
+ string returnString = Marshal.PtrToStringAnsi (ptr);
+
+ MmsValue_delete (mmsValue);
+
+ return returnString;
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type quality.
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public Quality ReadQualityValue (string objectReference, FunctionalConstraint fc)
+ {
+ IntPtr mmsValue = readObjectInternal (objectReference, fc);
+
+ if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) {
+ int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue);
+
+ MmsValue_delete (mmsValue);
+ return new Quality (bitStringValue);
+ } else {
+ MmsValue_delete (mmsValue);
+ throw new IedConnectionException ("Result is not of type bit string(Quality)", 0);
+ }
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type bit string.
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public int ReadBitStringValue (string objectReference, FunctionalConstraint fc)
+ {
+ IntPtr mmsValue = readObjectInternal (objectReference, fc);
+
+ if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) {
+ int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue);
+
+ MmsValue_delete (mmsValue);
+ return bitStringValue;
+ } else {
+ MmsValue_delete (mmsValue);
+ throw new IedConnectionException ("Result is not of type bit string", 0);
+ }
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type timestamp (MMS_UTC_TIME).
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public UInt64 ReadTimestampValue (string objectReference, FunctionalConstraint fc)
+ {
+ var mmsValuePtr = readObjectInternal (objectReference, fc);
+
+ var mmsValue = new MmsValue (mmsValuePtr, true);
+
+ if (mmsValue.GetType () == MmsType.MMS_UTC_TIME)
+ return mmsValue.GetUtcTimeInMs ();
+ else
+ throw new IedConnectionException ("Result is not of type timestamp (MMS_UTC_TIME)", 0);
+ }
+
+ /// Read the value of a basic data attribute (BDA) of type integer (MMS_INTEGER).
+ /// This function should also be used if enumerations are beeing read. Because
+ /// enumerations are mapped to integer types for the MMS mapping
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// This exception is thrown if there is a connection or service error
+ public Int64 ReadIntegerValue (string objectReference, FunctionalConstraint fc)
+ {
+ var mmsValuePtr = readObjectInternal (objectReference, fc);
+
+ var mmsValue = new MmsValue (mmsValuePtr, true);
+
+ if (mmsValue.GetType () == MmsType.MMS_INTEGER)
+ return mmsValue.ToInt64 ();
+ else
+ throw new IedConnectionException ("Result is not of type integer (MMS_INTEGER)", 0);
+ }
+
+ /// Write the value of a data attribute (DA) or functional constraint data object (FCDO).
+ /// This function can be used to write simple or complex variables (setpoints, parameters, descriptive values...)
+ /// of the server.
+ /// The object reference of a BDA.
+ /// The functional constraint (FC) of the object
+ /// MmsValue object representing asimple or complex variable data
+ /// This exception is thrown if there is a connection or service error
+ public void WriteValue (string objectReference, FunctionalConstraint fc, MmsValue value)
+ {
+ int error;
+
+ IedConnection_writeObject (connection, out error, objectReference, (int)fc, value.valueReference);
+
+ if (error != 0)
+ throw new IedConnectionException ("Write value failed", error);
+ }
+
+ /// Read the content of a file directory.
+ /// The name of the directory.
+ /// This exception is thrown if there is a connection or service error
+ public List GetFileDirectory(string directoryName)
+ {
+ int error;
+
+ IntPtr fileEntryList = IedConnection_getFileDirectory(connection, out error, directoryName);
+
+ if (error != 0)
+ throw new IedConnectionException("Reading file directory failed", error);
+
+ List fileDirectory = new List();
+
+ IntPtr element = LinkedList_getNext(fileEntryList);
+
+ while (element != IntPtr.Zero)
+ {
+ IntPtr elementData = LinkedList_getData(element);
+
+ FileDirectoryEntry entry = new FileDirectoryEntry(elementData);
+
+ fileDirectory.Add(entry);
+
+ FileDirectoryEntry_destroy(elementData);
+
+ element = LinkedList_getNext(element);
+ }
+
+ LinkedList_destroyStatic(fileEntryList);
+
+ return fileDirectory;
+ }
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ private delegate bool InternalIedClientGetFileHandler(IntPtr parameter, IntPtr buffer, UInt32 bytesRead);
+
+ private bool iedClientGetFileHandler(IntPtr parameter, IntPtr buffer, UInt32 bytesRead)
+ {
+ GCHandle handle = GCHandle.FromIntPtr(parameter);
+
+ GetFileCallback getFileCallback = (GetFileCallback) handle.Target;
+
+ byte[] bytes = new byte[bytesRead];
+
+ Marshal.Copy(buffer, bytes, 0, (int) bytesRead);
+
+ return getFileCallback.handler(getFileCallback.parameter, bytes);
+ }
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 IedConnection_getFile(IntPtr self, out int error, string fileName, InternalIedClientGetFileHandler handler,
+ IntPtr handlerParameter);
+
+
+ public delegate bool GetFileHandler(object parameter, byte[] data);
+
+ private class GetFileCallback
+ {
+ public GetFileCallback(GetFileHandler handler, object parameter)
+ {
+ this.handler = handler;
+ this.parameter = parameter;
+ }
+
+ public GetFileHandler handler;
+ public object parameter;
+ }
+
+ ///
+ /// Download a file from the server.
+ ///
+ ///
+ /// File name of the file (full path)
+ ///
+ ///
+ /// Callback handler that is invoked for each chunk of the file received
+ ///
+ ///
+ /// User provided parameter that is passed to the callback handler
+ ///
+ public void GetFile(string fileName, GetFileHandler handler, object parameter)
+ {
+ int error;
+
+ GetFileCallback getFileCallback = new GetFileCallback(handler, parameter);
+
+ GCHandle handle = GCHandle.Alloc(getFileCallback);
+
+ IedConnection_getFile(connection, out error, fileName, new InternalIedClientGetFileHandler(iedClientGetFileHandler),
+ GCHandle.ToIntPtr(handle));
+
+ if (error != 0)
+ throw new IedConnectionException("Error reading file", error);
+
+ handle.Free();
+ }
+
+ ///
+ /// Abort (close) the connection.
+ ///
+ /// This function will send an abort request to the server. This will immediately interrupt the
+ /// connection.
+ /// This exception is thrown if there is a connection or service error
+ public void Abort ()
+ {
+ int error;
+
+ IedConnection_abort (connection, out error);
+
+ if (error != 0)
+ throw new IedConnectionException ("Abort failed", error);
+ }
+
+ ///
+ /// Release (close) the connection.
+ ///
+ /// This function will send an release request to the server. The function will block until the
+ /// connection is released or an error occured.
+ /// This exception is thrown if there is a connection or service error
+ public void Release ()
+ {
+ int error;
+
+ IedConnection_release(connection, out error);
+
+ if (error != 0)
+ throw new IedConnectionException ("Release failed", error);
+ }
+
+ ///
+ /// Immediately close the connection.
+ ///
+ /// This function will close the connnection to the server by closing the TCP connection.
+ /// The client will not send an abort or release request as required by the specification!
+ /// This exception is thrown if there is a connection or service error
+ public void Close ()
+ {
+ IedConnection_close(connection);
+ }
+
+ private void MyConnectionClosedHandler (IntPtr parameter, IntPtr self)
+ {
+ if (userProvidedHandler != null)
+ userProvidedHandler (this);
+ }
+
+ ///
+ /// Install a callback handler that will be invoked if the connection is closed.
+ ///
+ /// The handler is called when the connection is closed no matter if the connection was closed
+ /// by the client or by the server. Any new call to this function will replace the callback handler installed
+ /// by a prior function call.
+ /// The user provided callback handler
+ /// This exception is thrown if there is a connection or service error
+ public void InstallConnectionClosedHandler (ConnectionClosedHandler handler)
+ {
+ connectionClosedHandler = new InternalConnectionClosedHandler (MyConnectionClosedHandler);
+
+ userProvidedHandler = handler;
+
+ IedConnection_installConnectionClosedHandler (connection, connectionClosedHandler, connection);
+ }
+
+ ///
+ /// Read the values of a data set (GetDataSetValues service).
+ ///
+ /// This function will invoke a readDataSetValues service and return a new DataSet value containing the
+ /// received values.
+ /// The object reference of the data set
+
+ /// This exception is thrown if there is a connection or service error
+ public DataSet GetDataSetValues (string dataSetReference)
+ {
+ return ReadDataSetValues(dataSetReference, null);
+ }
+
+ ///
+ /// Read the values of a data set (GetDataSetValues service).
+ ///
+ /// This function will invoke a readDataSetValues service and return a new DataSet value containing the
+ /// received values. If an existing instance of DataSet is provided to the function the existing instance will be
+ /// updated by the new values.
+ /// The object reference of the data set
+ /// The object reference of an existing data set instance or null
+ /// a DataSet instance containing the received values
+ /// This exception is thrown if there is a connection or service error
+ public DataSet ReadDataSetValues (string dataSetReference, DataSet dataSet)
+ {
+ IntPtr nativeClientDataSet = IntPtr.Zero;
+
+ if (dataSet != null)
+ nativeClientDataSet = dataSet.getNativeInstance ();
+
+ int error;
+
+ nativeClientDataSet = IedConnection_readDataSetValues (connection, out error, dataSetReference, nativeClientDataSet);
+
+ if (error != 0)
+ throw new IedConnectionException ("Reading data set failed", error);
+
+ if (dataSet == null)
+ dataSet = new DataSet (nativeClientDataSet);
+
+ return dataSet;
+ }
+
+ ///
+ /// Create a new data set.
+ ///
+ /// This function creates a new data set at the server. The data set consists of the members defined
+ /// by the list of object references provided.
+ /// The object reference of the data set
+ /// A list of object references of the data set elements
+ /// This exception is thrown if there is a connection or service error
+ public void CreateDataSet (string dataSetReference, List dataSetElements)
+ {
+ IntPtr linkedList = LinkedList_create ();
+
+ foreach (string dataSetElement in dataSetElements) {
+ IntPtr handle = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi (dataSetElement);
+
+ LinkedList_add (linkedList, handle);
+ }
+
+ int error;
+
+ IedConnection_createDataSet (connection, out error, dataSetReference, linkedList);
+
+ LinkedList_destroyDeep(linkedList, new LinkedListValueDeleteFunction(FreeHGlobaleDeleteFunction));
+
+ if (error != 0)
+ throw new IedConnectionException ("Failed to create data set", error);
+
+ }
+
+ ///
+ /// Delete a data set.
+ ///
+ /// This function will delete a data set at the server. This function may fail if the data set is not
+ /// deletable.
+ /// The object reference of the data set
+ /// This exception is thrown if there is a connection or service error
+ public void DeleteDataSet (string dataSetReference)
+ {
+ int error;
+
+ IedConnection_deleteDataSet (connection, out error, dataSetReference);
+
+ if (error != 0)
+ throw new IedConnectionException ("Failed to delete data set", error);
+ }
+
+ ///
+ /// Get the directory of the data set.
+ ///
+ /// This function returns a list of object references with appended functional constraints (FC) of the data set elemenents.
+ /// The object reference of the data set
+ /// the list of object references
+ /// This exception is thrown if there is a connection or service error
+ public List GetDataSetDirectory(string dataSetReference)
+ {
+ bool isDeletable;
+
+ return GetDataSetDirectory(dataSetReference, out isDeletable);
+ }
+
+ ///
+ /// Get the directory of the data set.
+ ///
+ /// This function returns a list of object references with appended functional constraints (FC) of the data set elemenents.
+ /// The object reference of the data set
+ /// Indication if this data set is permanent or deletable.
+ /// the list of object references
+ /// This exception is thrown if there is a connection or service error
+ public List GetDataSetDirectory (string dataSetReference, out bool isDeletable)
+ {
+ int error;
+
+ IntPtr linkedList = IedConnection_getDataSetDirectory (connection, out error, dataSetReference, out isDeletable);
+
+ if (error != 0)
+ throw new IedConnectionException ("getDataSetDirectory failed", error);
+
+ IntPtr element = LinkedList_getNext (linkedList);
+
+ List newList = new List ();
+
+ while (element != IntPtr.Zero) {
+ string dataObject = Marshal.PtrToStringAnsi (LinkedList_getData (element));
+
+ newList.Add (dataObject);
+
+ element = LinkedList_getNext (element);
+ }
+
+ LinkedList_destroy (linkedList);
+
+ return newList;
+ }
+ }
+
+ public class IedConnectionException : Exception
+ {
+
+ private int errorCode;
+
+ public IedConnectionException (string message, int errorCode) : base(message)
+ {
+ this.errorCode = errorCode;
+ }
+
+ public IedConnectionException (string message) : base(message)
+ {
+ this.errorCode = 0;
+ }
+
+ public int GetErrorCode ()
+ {
+ return this.errorCode;
+ }
+
+ public IedClientError GetIedClientError ()
+ {
+ return (IedClientError)this.errorCode;
+ }
+ }
+
+ public class FileDirectoryEntry
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern IntPtr FileDirectoryEntry_getFileName(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern UInt32 FileDirectoryEntry_getFileSize(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern UInt64 FileDirectoryEntry_getLastModified(IntPtr self);
+
+ private string fileName;
+ private UInt32 fileSize;
+ private UInt64 lastModified;
+
+ internal FileDirectoryEntry(IntPtr nativeFileDirectoryEntry)
+ {
+ fileName = Marshal.PtrToStringAnsi(FileDirectoryEntry_getFileName(nativeFileDirectoryEntry));
+ fileSize = FileDirectoryEntry_getFileSize(nativeFileDirectoryEntry);
+ lastModified = FileDirectoryEntry_getLastModified(nativeFileDirectoryEntry);
+ }
+
+ public string GetFileName()
+ {
+ return fileName;
+ }
+
+ public UInt32 GetFileSize()
+ {
+ return fileSize;
+ }
+
+ public UInt64 GetLastModified()
+ {
+ return lastModified;
+ }
+ }
+
+ public enum IedClientError
+ {
+ /* general errors */
+
+ /** No error occurred - service request has been successful */
+ IED_ERROR_OK = 0,
+
+ /** The service request can not be executed because the client is not yet connected */
+ IED_ERROR_NOT_CONNECTED = 1,
+
+ /** Connect service not execute because the client is already connected */
+ IED_ERROR_ALREADY_CONNECTED = 2,
+
+ /** The service request can not be executed caused by a loss of connection */
+ IED_ERROR_CONNECTION_LOST = 3,
+
+ /** The service or some given parameters are not supported by the client stack or by the server */
+ IED_ERROR_SERVICE_NOT_SUPPORTED = 4,
+
+ /** Connection rejected by server */
+ IED_ERROR_CONNECTION_REJECTED = 5,
+
+ /* client side errors */
+
+ /** API function has been called with an invalid argument */
+ IED_ERROR_USER_PROVIDED_INVALID_ARGUMENT = 10,
+
+ IED_ERROR_ENABLE_REPORT_FAILED_DATASET_MISMATCH = 11,
+
+ /** The object provided object reference is invalid (there is a syntactical error). */
+ IED_ERROR_OBJECT_REFERENCE_INVALID = 12,
+
+ /** Received object is of unexpected type */
+ IED_ERROR_UNEXPECTED_VALUE_RECEIVED = 13,
+
+ /* service error - error reported by server */
+
+ /** The communication to the server failed with a timeout */
+ IED_ERROR_TIMEOUT = 20,
+
+ /** The server rejected the access to the requested object/service due to access control */
+ IED_ERROR_ACCESS_DENIED = 21,
+
+ /** The server reported that the requested object does not exist */
+ IED_ERROR_OBJECT_DOES_NOT_EXIST = 22,
+
+ /** The server reported that the requested object already exists */
+ IED_ERROR_OBJECT_EXISTS = 23,
+
+ /** The server does not support the requested access method */
+ IED_ERROR_OBJECT_ACCESS_UNSUPPORTED = 24,
+
+ /** The server expected an object of another type */
+ IED_ERROR_TYPE_INCONSISTENT = 25,
+
+ /** The object or service is temporarily unavailable */
+ IED_ERROR_TEMPORARILY_UNAVAILABLE = 26,
+
+ /** The specified object is not defined in the server (returned by server) */
+ IED_ERROR_OBJECT_UNDEFINED = 27,
+
+ /** The specified address is invalid (returned by server) */
+ IED_ERROR_INVALID_ADDRESS = 28,
+
+ /** Service failed due to a hardware fault (returned by server) */
+ IED_ERROR_HARDWARE_FAULT = 29,
+
+ /** The requested data type is not supported by the server (returned by server) */
+ IED_ERROR_TYPE_UNSUPPORTED = 30,
+
+ /** The provided attributes are inconsistent (returned by server) */
+ IED_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT = 31,
+
+ /** The provided object value is invalid (returned by server) */
+ IED_ERROR_OBJECT_VALUE_INVALID = 32,
+
+ /** The object is invalidated (returned by server) */
+ IED_ERROR_OBJECT_INVALIDATED = 33,
+
+ /* unknown error */
+ IED_ERROR_UNKNOWN = 99
+ }
+ }
+
+ namespace Common
+ {
+
+ [Flags]
+ public enum TriggerOptions {
+ NONE = 0,
+ /** send report when value of data changed */
+ DATA_CHANGED = 1,
+ /** send report when quality of data changed */
+ QUALITY_CHANGED = 2,
+ /** send report when data or quality is updated */
+ DATA_UPDATE = 4,
+ /** periodic transmission of all data set values */
+ INTEGRITY = 8,
+ /** general interrogation (on client request) */
+ GI = 16
+ }
+
+ [Flags]
+ public enum ReportOptions {
+ NONE = 0,
+ SEQ_NUM = 1,
+ TIME_STAMP = 2,
+ REASON_FOR_INCLUSION = 4,
+ DATA_SET = 8,
+ DATA_REFERENCE = 16,
+ BUFFER_OVERFLOW = 32,
+ ENTRY_ID = 64,
+ CONF_REV = 128
+ }
+
+ public enum Validity
+ {
+ GOOD = 0,
+ INVALID = 1,
+ RESERVED = 2,
+ QUESTIONABLE = 3
+ }
+
+ ///
+ /// The quality of a data object.
+ ///
+ public class Quality
+ {
+
+ private UInt16 value;
+
+ public Quality (int bitStringValue)
+ {
+ value = (UInt16)bitStringValue;
+ }
+
+ public Quality ()
+ {
+ value = 0;
+ }
+
+ public Validity GetValidity ()
+ {
+ int qualityVal = value & 0x3;
+
+ return (Validity)qualityVal;
+ }
+
+ public void SetValidity (Validity validity)
+ {
+ value = (UInt16)(value & 0xfffc);
+
+ value += (ushort)validity;
+ }
+ }
+
+ public enum ACSIClass
+ {
+ /** data objects */
+ ACSI_CLASS_DATA_OBJECT,
+ /** data sets (container for multiple data objects) */
+ ACSI_CLASS_DATA_SET,
+ /** buffered report control blocks */
+ ACSI_CLASS_BRCB,
+ /** unbuffered report control blocks */
+ ACSI_CLASS_URCB,
+ /** log control blocks */
+ ACSI_CLASS_LCB,
+ /** logs (journals) */
+ ACSI_CLASS_LOG,
+ /** setting group control blocks */
+ ACSI_CLASS_SGCB,
+ /** GOOSE control blocks */
+ ACSI_CLASS_GoCB,
+ /** GSE control blocks */
+ ACSI_CLASS_GsCB,
+ /** multicast sampled values control blocks */
+ ACSI_CLASS_MSVCB,
+ /** unicast sampled values control blocks */
+ ACSI_CLASS_USVCB
+ }
+
+ public enum FunctionalConstraint
+ {
+ /** Status information */
+ ST = 0,
+ /** Measurands - analog values */
+ MX = 1,
+ /** Setpoint */
+ SP = 2,
+ /** Substitution */
+ SV = 3,
+ /** Configuration */
+ CF = 4,
+ /** Description */
+ DC = 5,
+ /** Setting group */
+ SG = 6,
+ /** Setting group editable */
+ SE = 7,
+ /** Service response / Service tracking */
+ SR = 8,
+ /** Operate received */
+ OR = 9,
+ /** Blocking */
+ BL = 10,
+ /** Extended definition */
+ EX = 11,
+ /** Control */
+ CO = 12,
+ ALL = 99,
+ NONE = -1
+ }
+
+ public enum ControlAddCause {
+ ADD_CAUSE_UNKNOWN = 0,
+ ADD_CAUSE_NOT_SUPPORTED = 1,
+ ADD_CAUSE_BLOCKED_BY_SWITCHING_HIERARCHY = 2,
+ ADD_CAUSE_SELECT_FAILED = 3,
+ ADD_CAUSE_INVALID_POSITION = 4,
+ ADD_CAUSE_POSITION_REACHED = 5,
+ ADD_CAUSE_PARAMETER_CHANGE_IN_EXECUTION = 6,
+ ADD_CAUSE_STEP_LIMIT = 7,
+ ADD_CAUSE_BLOCKED_BY_MODE = 8,
+ ADD_CAUSE_BLOCKED_BY_PROCESS = 9,
+ ADD_CAUSE_BLOCKED_BY_INTERLOCKING = 10,
+ ADD_CAUSE_BLOCKED_BY_SYNCHROCHECK = 11,
+ ADD_CAUSE_COMMAND_ALREADY_IN_EXECUTION = 12,
+ ADD_CAUSE_BLOCKED_BY_HEALTH = 13,
+ ADD_CAUSE_1_OF_N_CONTROL = 14,
+ ADD_CAUSE_ABORTION_BY_CANCEL = 15,
+ ADD_CAUSE_TIME_LIMIT_OVER = 16,
+ ADD_CAUSE_ABORTION_BY_TRIP = 17,
+ ADD_CAUSE_OBJECT_NOT_SELECTED = 18,
+ ADD_CAUSE_OBJECT_ALREADY_SELECTED = 19,
+ ADD_CAUSE_NO_ACCESS_AUTHORITY = 20,
+ ADD_CAUSE_ENDED_WITH_OVERSHOOT = 21,
+ ADD_CAUSE_ABORTION_DUE_TO_DEVIATION = 22,
+ ADD_CAUSE_ABORTION_BY_COMMUNICATION_LOSS = 23,
+ ADD_CAUSE_ABORTION_BY_COMMAND = 24,
+ ADD_CAUSE_NONE = 25,
+ ADD_CAUSE_INCONSISTENT_PARAMETERS = 26,
+ ADD_CAUSE_LOCKED_BY_OTHER_CLIENT = 27
+ }
+
+ ///
+ /// Object reference. Helper function to handle object reference strings.
+ ///
+ public static class ObjectReference {
+
+ ///
+ /// Get the name part of an object reference with appended FC
+ ///
+ ///
+ /// The element name.
+ ///
+ ///
+ /// Object reference with appended fc.
+ ///
+ public static string getElementName (string objectReferenceWithFc)
+ {
+ int fcPartStartIndex = objectReferenceWithFc.IndexOf('[');
+
+ if (fcPartStartIndex == -1)
+ return objectReferenceWithFc;
+
+ return objectReferenceWithFc.Substring(0, fcPartStartIndex);
+ }
+
+ ///
+ /// Get the FC of an object reference with appended FC.
+ ///
+ ///
+ /// The FC
+ ///
+ ///
+ /// Object reference with FC.
+ ///
+ public static FunctionalConstraint getFC (string objectReferenceWithFc)
+ {
+ int fcPartStartIndex = objectReferenceWithFc.IndexOf('[');
+
+ if (fcPartStartIndex == -1)
+ return FunctionalConstraint.NONE;
+
+ string fcString = objectReferenceWithFc.Substring(fcPartStartIndex + 1 , 2);
+
+ try
+ {
+ return (FunctionalConstraint) Enum.Parse(typeof(FunctionalConstraint), fcString);
+ }
+ catch(ArgumentException)
+ {
+ return FunctionalConstraint.NONE;
+ }
+ }
+ }
+
+ }
+}
diff --git a/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj
new file mode 100644
index 0000000..d5d09da
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj
@@ -0,0 +1,50 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ Library
+ iec61850dotnet
+ iec61850dotnet
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dotnet/IEC61850forCSharp/IsoConnectionParameters.cs b/dotnet/IEC61850forCSharp/IsoConnectionParameters.cs
new file mode 100644
index 0000000..342dbc3
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/IsoConnectionParameters.cs
@@ -0,0 +1,203 @@
+/*
+ * IsoConnectionParameters.cs
+ *
+ * Copyright 2014 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.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace IEC61850
+{
+ namespace Client
+ {
+
+ public enum AcseAuthenticationMechanism {
+ /** don't use authentication */
+ ACSE_AUTH_NONE = 0,
+ /** use password authentication */
+ ACSE_AUTH_PASSWORD = 1
+ }
+
+ ///
+ /// Connection parameters associated with the ISO protocol layers (transport, session, presentation, ACSE)
+ ///
+ public class IsoConnectionParameters
+ {
+
+ [StructLayout(LayoutKind.Sequential)]
+ private struct NativeTSelector
+ {
+ public byte size;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public byte[] value;
+ }
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_destroy(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_setRemoteApTitle(IntPtr self, string apTitle, int aeQualifier);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_setRemoteAddresses(IntPtr self, UInt32 pSelector, UInt16 sSelector, NativeTSelector tSelector);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_setLocalApTitle(IntPtr self, string apTitle, int aeQualifier);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_setLocalAddresses(IntPtr self, UInt32 pSelector, UInt16 sSelector, NativeTSelector tSelector);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void IsoConnectionParameters_setAcseAuthenticationParameter(IntPtr self, IntPtr acseAuthParameter);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern IntPtr AcseAuthenticationParameter_create();
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void AcseAuthenticationParameter_destroy(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void AcseAuthenticationParameter_setAuthMechanism(IntPtr self, int mechanism);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void AcseAuthenticationParameter_setPassword(IntPtr self, string password);
+
+ private IntPtr self;
+
+ private IntPtr authParameter = IntPtr.Zero;
+
+ internal IsoConnectionParameters (IntPtr self)
+ {
+ this.self = self;
+ }
+
+ ~IsoConnectionParameters ()
+ {
+ if (authParameter != IntPtr.Zero)
+ AcseAuthenticationParameter_destroy(authParameter);
+
+ //IsoConnectionParameters_destroy(self);
+ }
+
+ ///
+ /// Sets the remote ap title related parameters
+ ///
+ ///
+ /// remote AP title.
+ ///
+ ///
+ /// remote AE qualifier.
+ ///
+ public void SetRemoteApTitle(string apTitle, int aeQualifier)
+ {
+ IsoConnectionParameters_setRemoteApTitle(self, apTitle, aeQualifier);
+ }
+
+ ///
+ /// Sets the remote addresses for ISO layers (transport, session, presentation)
+ ///
+ ///
+ /// presentation layer address
+ ///
+ ///
+ /// session layer address
+ ///
+ ///
+ /// ISO COTP transport layer address
+ ///
+ public void SetRemoteAddresses (UInt32 pSelector, UInt16 sSelector, byte[] tSelector)
+ {
+ if (tSelector.Length > 4)
+ throw new ArgumentOutOfRangeException("tSelector", "maximum size (4) exceeded");
+
+ NativeTSelector nativeTSelector;
+ nativeTSelector.size = (byte) tSelector.Length;
+ nativeTSelector.value = new byte[4];
+
+ for (int i = 0; i < tSelector.Length; i++)
+ nativeTSelector.value[i] = tSelector[i];
+
+ IsoConnectionParameters_setRemoteAddresses(self, pSelector, sSelector, nativeTSelector);
+ }
+
+ ///
+ /// Sets the local ap title related parameters
+ ///
+ ///
+ /// local AP title.
+ ///
+ ///
+ /// local AE qualifier.
+ ///
+ public void SetLocalApTitle (string apTitle, int aeQualifier)
+ {
+ IsoConnectionParameters_setLocalApTitle(self, apTitle, aeQualifier);
+ }
+
+ ///
+ /// Sets the local addresses for ISO layers (transport, session, presentation)
+ ///
+ ///
+ /// presentation layer address
+ ///
+ ///
+ /// session layer address
+ ///
+ ///
+ /// ISO COTP transport layer address
+ ///
+ public void SetLocalAddresses (UInt32 pSelector, UInt16 sSelector, byte[] tSelector)
+ {
+ if (tSelector.Length > 4)
+ throw new ArgumentOutOfRangeException("tSelector", "maximum size (4) exceeded");
+
+ NativeTSelector nativeTSelector;
+ nativeTSelector.size = (byte) tSelector.Length;
+ nativeTSelector.value = new byte[4];
+
+ for (int i = 0; i < tSelector.Length; i++)
+ nativeTSelector.value[i] = tSelector[i];
+
+ IsoConnectionParameters_setLocalAddresses(self, pSelector, sSelector, nativeTSelector);
+ }
+
+ ///
+ /// Instruct ACSE layer to use password authentication.
+ ///
+ ///
+ /// Password that will be used to authenticate the client
+ ///
+ public void UsePasswordAuthentication (string password)
+ {
+ if (authParameter == IntPtr.Zero) {
+ authParameter = AcseAuthenticationParameter_create ();
+ AcseAuthenticationParameter_setAuthMechanism (authParameter, (int)AcseAuthenticationMechanism.ACSE_AUTH_PASSWORD);
+ AcseAuthenticationParameter_setPassword (authParameter, password);
+ IsoConnectionParameters_setAcseAuthenticationParameter(self, authParameter);
+ }
+ else
+ throw new IedConnectionException("Authentication parameter already set");
+ }
+ }
+
+ }
+}
+
diff --git a/dotnet/IEC61850forCSharp/MmsValue.cs b/dotnet/IEC61850forCSharp/MmsValue.cs
new file mode 100644
index 0000000..3f69b7b
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/MmsValue.cs
@@ -0,0 +1,726 @@
+/*
+ * MmsValue.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+
+using System.Collections;
+using System.Text;
+
+namespace IEC61850
+{
+ namespace Common
+ {
+
+ ///
+ /// This class is used to hold MMS data values of different types.
+ ///
+ public class MmsValue : IEnumerable
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_toString (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern float MmsValue_toFloat (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern double MmsValue_toDouble (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool MmsValue_getBoolean (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 MmsValue_getBitStringAsInteger (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void MmsValue_setBitStringFromInteger(IntPtr self, UInt32 intValue);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsValue_getBitStringSize(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void MmsValue_setBitStringBit(IntPtr self, int bitPos, bool value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool MmsValue_getBitStringBit(IntPtr self, int bitPos);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern Int32 MmsValue_toInt32 (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern Int64 MmsValue_toInt64 (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 MmsValue_toUint32 (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsValue_getType (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void MmsValue_delete (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_getElement (IntPtr complexValue, int index);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsValue_getArraySize (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern ulong MmsValue_getUtcTimeInMs (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern ulong MmsValue_getUtcTimeInMsWithUs(IntPtr self, [Out] uint usec);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 MmsValue_toUnixTimestamp (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newBoolean (bool value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newFloat (float value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newDouble (double value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newIntegerFromInt32 (Int32 integer);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newUnsignedFromUint32(UInt32 integer);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newIntegerFromInt64 (Int64 integer);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newBitString(int bitSize);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newVisibleString(string value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_newOctetString(int size, int maxSize);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void MmsValue_setOctetString(IntPtr self, [Out] byte[] buf, int size);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt16 MmsValue_getOctetStringSize(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt16 MmsValue_getOctetStringMaxSize(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsValue_getOctetStringBuffer(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool MmsValue_equals(IntPtr self, IntPtr otherValue);
+
+
+ internal MmsValue (IntPtr value)
+ {
+ valueReference = value;
+ this.responsableForDeletion = false;
+ }
+
+ internal MmsValue (IntPtr value, bool responsableForDeletion)
+ {
+ valueReference = value;
+ this.responsableForDeletion = responsableForDeletion;
+ }
+
+ public MmsValue (bool value)
+ {
+ valueReference = MmsValue_newBoolean (value);
+ }
+
+ public MmsValue (float value)
+ {
+ valueReference = MmsValue_newFloat (value);
+ }
+
+ public MmsValue (double value)
+ {
+ valueReference = MmsValue_newDouble (value);
+ }
+
+ public MmsValue (int value)
+ {
+ valueReference = MmsValue_newIntegerFromInt32 (value);
+ }
+
+ public MmsValue (UInt32 value)
+ {
+ valueReference = MmsValue_newUnsignedFromUint32(value);
+ }
+
+ public MmsValue (long value)
+ {
+ valueReference = MmsValue_newIntegerFromInt64 (value);
+ }
+
+ public MmsValue (string value)
+ {
+ valueReference = MmsValue_newVisibleString(value);
+ }
+
+ ~MmsValue ()
+ {
+ if (responsableForDeletion)
+ MmsValue_delete (valueReference);
+ }
+
+ ///
+ /// Create a new MmsValue instance of type MMS_BIT_STRING.
+ ///
+ ///
+ /// the new MmsValue instance
+ ///
+ ///
+ /// the size of the bit string in bits.
+ ///
+ public static MmsValue NewBitString(int bitSize)
+ {
+ IntPtr newValue = MmsValue_newBitString(bitSize);
+
+ return new MmsValue(newValue, true);
+ }
+
+ ///
+ /// Create a new MmsValue instance of type MMS_OCTET_STRING.
+ ///
+ ///
+ /// the new MmsValue instance
+ ///
+ ///
+ /// the maximum size of the octet string in bytes
+ ///
+ ///
+ /// the current size of the octet string in bytes (defaults to 0)
+ ///
+ public static MmsValue NewOctetString (int maxSize, int size = 0)
+ {
+ IntPtr newValue = MmsValue_newOctetString(size, maxSize);
+
+ return new MmsValue(newValue, true);
+ }
+
+ internal IntPtr valueReference;
+ private bool responsableForDeletion;
+
+ ///
+ /// Gets the type of the value
+ ///
+ ///
+ /// The type.
+ ///
+ public new MmsType GetType ()
+ {
+ return (MmsType)MmsValue_getType (valueReference);
+ }
+
+ ///
+ /// Gets the size of an array, structure, or bit string
+ ///
+ ///
+ ///
+ /// Return the size of an array of structure (number of elements)
+ /// The value has to be of type MMS_ARRAY, MMS_STRUCTURE, MMS_BIT_STRING ...
+ ///
+ /// the number of elements (array/structure elements, octets, bits depending on type)
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public int Size ()
+ {
+ if ((GetType () == MmsType.MMS_ARRAY) || (GetType () == MmsType.MMS_STRUCTURE)) {
+ return MmsValue_getArraySize (valueReference);
+ } else if (GetType () == MmsType.MMS_BIT_STRING) {
+ return MmsValue_getBitStringSize(valueReference);
+ }
+ else if (GetType () == MmsType.MMS_OCTET_STRING) {
+ return MmsValue_getOctetStringSize(valueReference);
+ }
+ else
+ throw new MmsValueException ("Operation not supported for this type");
+ }
+
+ ///
+ /// Gets the maximum size of an octet string
+ ///
+ ///
+ /// The maximum size (in bytes) of the octet string
+ ///
+ public int MaxSize ()
+ {
+ if (GetType () == MmsType.MMS_OCTET_STRING) {
+ return MmsValue_getOctetStringMaxSize(valueReference);
+ }
+ else
+ throw new MmsValueException ("Operation not supported for this type");
+ }
+
+ ///
+ /// Gets the octet string as byte array
+ ///
+ /// Instance has to be of type MMS_OCTET_STRING.
+ ///
+ ///
+ /// Byte array containing the bytes of the octet string.
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public byte[] getOctetString ()
+ {
+ if (GetType () == MmsType.MMS_OCTET_STRING) {
+ IntPtr buffer = MmsValue_getOctetStringBuffer(valueReference);
+ int bufferSize = this.Size();
+
+ byte[] octetString = new byte[bufferSize];
+
+ Marshal.Copy(buffer, octetString, 0, bufferSize);
+
+ return octetString;
+ }
+ else
+ throw new MmsValueException ("Operation not supported for this type");
+ }
+
+ public void setOctetString (byte[] octetString)
+ {
+ if (GetType () == MmsType.MMS_OCTET_STRING) {
+
+ if (this.MaxSize() < octetString.Length)
+ throw new MmsValueException("octet string is to large");
+
+ MmsValue_setOctetString(valueReference, octetString, octetString.Length);
+ }
+ else
+ throw new MmsValueException ("Operation not supported for this type");
+ }
+
+ ///
+ /// Get an element of an array or structure
+ ///
+ ///
+ /// the MmsValue element.
+ ///
+ ///
+ /// index of the element starting with 0
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ /// This exception is thrown if the index is out of range.
+ public MmsValue GetElement (int index)
+ {
+ MmsType type = GetType ();
+
+ if ((type == MmsType.MMS_ARRAY) || (type == MmsType.MMS_STRUCTURE)) {
+ if ((index >= 0) && (index < Size ())) {
+ IntPtr value = MmsValue_getElement (valueReference, index);
+
+ if (value == IntPtr.Zero)
+ return null;
+ else
+ return new MmsValue (value);
+ } else
+ throw new MmsValueException ("Index out of bounds");
+ } else
+ throw new MmsValueException ("Value is of wrong type");
+ }
+
+ ///
+ /// Gets the timestamp value as UTC time in s (UNIX time stamp).
+ ///
+ ///
+ /// Return the value as seconds since epoch (1.1.1970 UTC).
+ /// The value has to be of type MMS_UTC_TIME.
+ ///
+ ///
+ /// The UTC time in seconds (UNIX time stamp).
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public UInt32 ToUnixTimestamp ()
+ {
+ if (GetType () == MmsType.MMS_UTC_TIME)
+ return MmsValue_toUnixTimestamp (valueReference);
+ else
+ throw new MmsValueException ("Value is not a time type");
+ }
+
+ ///
+ /// Gets the timestamp value as UTC time in ms.
+ ///
+ ///
+ /// Return the value as milliseconds since epoch (1.1.1970 UTC).
+ /// The value has to be of type MMS_UTC_TIME.
+ ///
+ ///
+ /// The UTC time in ms.
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public ulong GetUtcTimeInMs ()
+ {
+ if (GetType () == MmsType.MMS_UTC_TIME) {
+ return MmsValue_getUtcTimeInMs (valueReference);
+ } else
+ throw new MmsValueException ("Value is not a time type");
+ }
+
+ ///
+ /// Gets the timestamp value as UTC time in ms and the additional us part.
+ ///
+ ///
+ /// Return the value as milliseconds since epoch (1.1.1970 UTC) and the additional us part.
+ /// The value has to be of type MMS_UTC_TIME.
+ ///
+ ///
+ /// returns the usec part of the time value
+ ///
+ ///
+ /// The UTC time in ms.
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public ulong GetUtcTimeInMsWithUs(out int usec)
+ {
+ if (GetType() == MmsType.MMS_UTC_TIME)
+ {
+ uint uusec = 0;
+ var msVal = MmsValue_getUtcTimeInMsWithUs(valueReference, uusec);
+ usec = (int)uusec;
+ return msVal;
+ }
+ else
+ throw new MmsValueException("Value is not a time type");
+ }
+
+ ///
+ /// Convert a millisecond time (milliseconds since epoch) to DataTimeOffset
+ ///
+ ///
+ /// The time as DataTimeOffset
+ ///
+ ///
+ /// the millisecond time
+ ///
+ public static DateTimeOffset MsTimeToDateTimeOffset (UInt64 msTime)
+ {
+ DateTimeOffset retVal = new DateTimeOffset (1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
+
+ return retVal.AddMilliseconds ((double) msTime);
+ }
+
+ ///
+ /// Convert MMS_UTC_TIME to DateTimeOffset instance
+ ///
+ ///
+ /// Return the value as DateTimeOffset instance.
+ /// The value has to be of type MMS_UTC_TIME.
+ ///
+ ///
+ /// the value as DataTimeOffset instance
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public DateTimeOffset GetUtcTimeAsDateTimeOffset ()
+ {
+ if (GetType () == MmsType.MMS_UTC_TIME)
+ return MsTimeToDateTimeOffset (GetUtcTimeInMs ());
+ else
+ throw new MmsValueException ("Value is not a time type");
+ }
+
+
+ ///
+ /// Return the value as 32 bit signed integer.
+ ///
+ ///
+ /// Return the value as 32 bit signed integer (Int32).
+ /// The value has to be of type MMS_INTEGER.
+ ///
+ ///
+ /// the value if the object as 32 bit signed integer
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public Int32 ToInt32 ()
+ {
+ if (GetType () != MmsType.MMS_INTEGER)
+ throw new MmsValueException ("Value type is not integer");
+
+ return MmsValue_toInt32 (valueReference);
+ }
+
+ ///
+ /// Return the value as 64 bit signed integer.
+ ///
+ ///
+ /// Return the value as 64 bit signed integer (Int64).
+ /// The value has to be of type MMS_INTEGER.
+ ///
+ ///
+ /// the value if the object as 64 bit signed integer
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public Int64 ToInt64 ()
+ {
+ if (GetType () != MmsType.MMS_INTEGER)
+ throw new MmsValueException ("Value type is not integer");
+
+ return MmsValue_toInt64 (valueReference);
+ }
+
+ ///
+ /// Return the value as 32 bit unsigned integer.
+ ///
+ ///
+ /// Return the value as 32 bit unsigned integer (Int32).
+ /// The value has to be of type MMS_INTEGER.
+ ///
+ ///
+ /// the value if the object as 32 bit unsigned integer
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public UInt32 ToUint32 ()
+ {
+ if (GetType () != MmsType.MMS_UNSIGNED)
+ throw new MmsValueException ("Value type is not unsigned");
+
+ return MmsValue_toUint32 (valueReference);
+ }
+
+ public UInt32 BitStringToUInt32 ()
+ {
+ if (GetType () != MmsType.MMS_BIT_STRING)
+ throw new MmsValueException("Value type is not bit string");
+
+ return MmsValue_getBitStringAsInteger(valueReference);
+ }
+
+ public void BitStringFromUInt32 (UInt32 intValue)
+ {
+ if (GetType () != MmsType.MMS_BIT_STRING)
+ throw new MmsValueException("Value type is not bit string");
+
+ MmsValue_setBitStringFromInteger(valueReference, intValue);
+ }
+
+ public void SetBit (int bitPos, bool bitValue)
+ {
+ if (GetType () != MmsType.MMS_BIT_STRING)
+ throw new MmsValueException("Value type is not bit string");
+
+ MmsValue_setBitStringBit(valueReference, bitPos, bitValue);
+ }
+
+ public bool GetBit (int bitPos)
+ {
+ if (GetType () != MmsType.MMS_BIT_STRING)
+ throw new MmsValueException("Value type is not bit string");
+
+ return MmsValue_getBitStringBit(valueReference, bitPos);
+ }
+
+ private string GetBitStringAsString()
+ {
+ if (GetType() != MmsType.MMS_BIT_STRING)
+ throw new MmsValueException("Value type is not bit string");
+
+ int size = Size();
+
+ StringBuilder builder = new StringBuilder(size);
+
+ for (int i = 0; i < size; i++)
+ {
+ if (MmsValue_getBitStringBit(valueReference, i))
+ builder.Append('1');
+ else
+ builder.Append('0');
+ }
+
+ return builder.ToString();
+ }
+
+ ///
+ /// Gets the boolean value
+ ///
+ ///
+ /// The boolean value
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public bool GetBoolean ()
+ {
+ if (GetType () == MmsType.MMS_BOOLEAN)
+ return MmsValue_getBoolean (valueReference);
+ else
+ throw new MmsValueException ("Value type is not boolean");
+ }
+
+ ///
+ /// Gets the float value of an MMS_FLOAT instance
+ ///
+ ///
+ /// The float value
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public float ToFloat ()
+ {
+ if (GetType () == MmsType.MMS_FLOAT)
+ return MmsValue_toFloat (valueReference);
+ else
+ throw new MmsValueException ("Value type is not float");
+ }
+
+ ///
+ /// Gets the double value of an MMS_FLOAT instance
+ ///
+ ///
+ /// The float value
+ ///
+ /// This exception is thrown if the value has the wrong type.
+ public double ToDouble ()
+ {
+ if (GetType () == MmsType.MMS_FLOAT)
+ return MmsValue_toDouble (valueReference);
+ else
+ throw new MmsValueException ("Value type is not float");
+ }
+
+ public override bool Equals (object obj)
+ {
+ MmsValue otherValue = (MmsValue) obj;
+
+ return MmsValue_equals(this.valueReference, otherValue.valueReference);
+ }
+
+ // override standard ToString() method
+ public override string ToString ()
+ {
+ switch (GetType ()) {
+ case MmsType.MMS_VISIBLE_STRING:
+ case MmsType.MMS_STRING:
+ return Marshal.PtrToStringAnsi (MmsValue_toString (valueReference));
+ case MmsType.MMS_BOOLEAN:
+ return GetBoolean ().ToString ();
+ case MmsType.MMS_INTEGER:
+ return ToInt64 ().ToString ();
+ case MmsType.MMS_UNSIGNED:
+ return ToUint32 ().ToString ();
+ case MmsType.MMS_FLOAT:
+ return ToDouble ().ToString ();
+ case MmsType.MMS_UTC_TIME:
+ return GetUtcTimeAsDateTimeOffset ().ToString ();
+ case MmsType.MMS_BIT_STRING:
+ return GetBitStringAsString();
+ default:
+ return "unknown";
+ }
+ }
+
+ IEnumerator IEnumerable.GetEnumerator ()
+ {
+ return new MmsValueEnumerator (this);
+ }
+
+ private class MmsValueEnumerator : IEnumerator
+ {
+ private MmsValue value;
+ private int index = -1;
+
+ public MmsValueEnumerator (MmsValue value)
+ {
+ this.value = value;
+ }
+
+ #region IEnumerator Members
+ public void Reset ()
+ {
+ index = -1;
+ }
+
+ public object Current {
+
+ get { return value.GetElement (index);}
+ }
+
+ public bool MoveNext ()
+ {
+ index++;
+
+ if (index >= value.Size ())
+ return false;
+ else
+ return true;
+ }
+
+ #endregion
+ }
+
+ }
+
+ public class MmsValueException : Exception
+ {
+ public MmsValueException (string message)
+ : base(message)
+ {
+ }
+ }
+
+ public enum MmsType
+ {
+ /** array type (multiple elements of the same type) */
+ MMS_ARRAY = 0,
+ /** structure type (multiple elements of different types) */
+ MMS_STRUCTURE = 1,
+ /** boolean */
+ MMS_BOOLEAN = 2,
+ /** bit string */
+ MMS_BIT_STRING = 3,
+ /** signed integer */
+ MMS_INTEGER = 4,
+ /** unsigned integer */
+ MMS_UNSIGNED = 5,
+ /** floating point value (32 or 64 bit) */
+ MMS_FLOAT = 6,
+ /** octet string */
+ MMS_OCTET_STRING = 7,
+ /** visible string - ANSI string */
+ MMS_VISIBLE_STRING = 8,
+ /** Generalized time */
+ MMS_GENERALIZED_TIME = 9,
+ /** Binary time */
+ MMS_BINARY_TIME = 10,
+ /** Binary coded decimal (BCD) - not used */
+ MMS_BCD = 11,
+ /** object ID - not used */
+ MMS_OBJ_ID = 12,
+ /** Unicode string */
+ MMS_STRING = 13,
+ /** UTC time */
+ MMS_UTC_TIME = 14,
+ /** will be returned in case of an error (contains error code) */
+ MMS_DATA_ACCESS_ERROR = 15
+ }
+
+ }
+}
+
diff --git a/dotnet/IEC61850forCSharp/MmsVariableSpecification.cs b/dotnet/IEC61850forCSharp/MmsVariableSpecification.cs
new file mode 100644
index 0000000..159f10e
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/MmsVariableSpecification.cs
@@ -0,0 +1,201 @@
+/*
+ * MmsVariableSpecification.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+
+using System.Collections;
+
+namespace IEC61850
+{
+ namespace Common
+ {
+ ///
+ /// MMS variable specification. This class is used to represent an MMS variable type definition.
+ ///
+ public class MmsVariableSpecification : IEnumerable
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void MmsVariableSpecification_destroy(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsVariableSpecification_getChildValue(IntPtr self, IntPtr value, string childId);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsVariableSpecification_getNamedVariableRecursive(IntPtr variable, string nameId);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsVariableSpecification_getType(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsVariableSpecification_getName(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsVariableSpecification_getSize(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsVariableSpecification_getChildSpecificationByIndex(IntPtr self, int index);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr MmsVariableSpecification_getArrayElementSpecification(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int MmsVariableSpecification_getExponentWidth(IntPtr self);
+
+ private IntPtr self;
+ private bool responsableForDeletion;
+
+ internal MmsVariableSpecification (IntPtr self)
+ {
+ this.self = self;
+ this.responsableForDeletion = false;
+ }
+
+ internal MmsVariableSpecification (IntPtr self, bool responsableForDeletion)
+ {
+ this.self = self;
+ this.responsableForDeletion = responsableForDeletion;
+ }
+
+ ~MmsVariableSpecification ()
+ {
+ if (responsableForDeletion)
+ MmsVariableSpecification_destroy(self);
+ }
+
+ ///
+ /// Gets the MmsValue type of the variable
+ ///
+ ///
+ /// The MmsType of the variable
+ ///
+ public new MmsType GetType ()
+ {
+ return (MmsType) MmsVariableSpecification_getType(self);
+ }
+
+ ///
+ /// Gets the type of the array elements.
+ ///
+ ///
+ /// The array element type.
+ ///
+ /// This exception is thrown if the value is not of type MMS_ARRAY
+ public MmsVariableSpecification getArrayElementType ()
+ {
+ if (GetType() == MmsType.MMS_ARRAY) {
+ IntPtr varSpecPtr = MmsVariableSpecification.MmsVariableSpecification_getArrayElementSpecification(self);
+ return new MmsVariableSpecification(varSpecPtr);
+ }
+ else
+ throw new MmsValueException ("specification is of wrong type");
+ }
+
+ ///
+ /// Gets the element specification of a structure element
+ ///
+ ///
+ /// The element of the structure at given index
+ ///
+ ///
+ /// Index.
+ ///
+ public MmsVariableSpecification GetElement (int index)
+ {
+ if (GetType () == MmsType.MMS_STRUCTURE) {
+
+ if ((index >= 0) && (index < Size ())) {
+ IntPtr varSpecPtr = MmsVariableSpecification_getChildSpecificationByIndex(self, index);
+ return new MmsVariableSpecification(varSpecPtr);
+ }
+ else
+ throw new MmsValueException ("Index out of bounds");
+ }
+ else
+ throw new MmsValueException ("specification is of wrong type");
+ }
+
+ ///
+ /// Gets the name of the variable
+ ///
+ ///
+ /// The name.
+ ///
+ public string GetName ()
+ {
+ IntPtr namePtr = MmsVariableSpecification_getName(self);
+
+ return Marshal.PtrToStringAnsi (namePtr);
+ }
+
+ ///
+ /// Get the "size" of the variable (array size, number of structure elements ...)
+ ///
+ public int Size ()
+ {
+ return MmsVariableSpecification_getSize(self);
+ }
+
+ IEnumerator IEnumerable.GetEnumerator ()
+ {
+ return new MmsVariableSpecificationEnumerator (this);
+ }
+
+ private class MmsVariableSpecificationEnumerator : IEnumerator
+ {
+ private MmsVariableSpecification value;
+ private int index = -1;
+
+ public MmsVariableSpecificationEnumerator (MmsVariableSpecification value)
+ {
+ this.value = value;
+ }
+
+ #region IEnumerator Members
+ public void Reset ()
+ {
+ index = -1;
+ }
+
+ public object Current {
+
+ get { return value.GetElement (index);}
+ }
+
+ public bool MoveNext ()
+ {
+ index++;
+
+ if (index >= value.Size ())
+ return false;
+ else
+ return true;
+ }
+
+ #endregion
+ }
+
+ }
+ }
+}
diff --git a/dotnet/IEC61850forCSharp/ReportControlBlock.cs b/dotnet/IEC61850forCSharp/ReportControlBlock.cs
new file mode 100644
index 0000000..889e8d6
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/ReportControlBlock.cs
@@ -0,0 +1,716 @@
+/*
+ * ReportControlBlock.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+
+using IEC61850.Common;
+
+namespace IEC61850
+{
+ namespace Client
+ {
+
+ ///
+ /// Report handler.
+ ///
+ public delegate void ReportHandler (Report report, object parameter);
+
+ ///
+ /// Report control block (RCB) representation.
+ ///
+ ///
+ /// This class is used as a client side representation (copy) of a report control block (RCB).
+ /// Values from the server will only be read when the GetRCBValues method is called.
+ /// Values at the server are only affected when the SetRCBValues method is called.
+ ///
+ public class ReportControlBlock
+ {
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReportControlBlock_create (string dataAttributeReference);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr IedConnection_getRCBValues (IntPtr connection, out int error, string rcbReference, IntPtr updateRcb);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_setRCBValues (IntPtr connection, out int error, IntPtr rcb, UInt32 parametersMask, bool singleRequest);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReportControlBlock_isBuffered (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReportControlBlock_getRptId (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setRptId (IntPtr self, string rptId);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReportControlBlock_getRptEna (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setRptEna(IntPtr self, bool rptEna);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReportControlBlock_getResv (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setResv (IntPtr self, bool resv);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReportControlBlock_getDataSetReference (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setDataSetReference (IntPtr self, string dataSetReference);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 ClientReportControlBlock_getConfRev (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int ClientReportControlBlock_getOptFlds (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setOptFlds (IntPtr self, int optFlds);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 ClientReportControlBlock_getBufTm (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setBufTm (IntPtr self, UInt32 bufTm);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt16 ClientReportControlBlock_getSqNum (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int ClientReportControlBlock_getTrgOps (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setTrgOps (IntPtr self, int trgOps);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 ClientReportControlBlock_getIntgPd (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setIntgPd (IntPtr self, UInt32 intgPd);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReportControlBlock_getGI (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setGI (IntPtr self, bool gi);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReportControlBlock_getPurgeBuf (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setPurgeBuf (IntPtr self, bool purgeBuf);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern Int32 ClientReportControlBlock_getResvTms (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setResvTms (IntPtr self, Int16 resvTms);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReportControlBlock_getEntryId (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void ClientReportControlBlock_setEntryId (IntPtr self, IntPtr entryId);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt64 ClientReportControlBlock_getEntryTime (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReportControlBlock_getOwner (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_installReportHandler (IntPtr connection, string rcbReference, string rptId, InternalReportHandler handler,
+ IntPtr handlerParameter);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void IedConnection_uninstallReportHandler(IntPtr connection, string rcbReference);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ private delegate void InternalReportHandler (IntPtr parameter, IntPtr report);
+
+ private IntPtr self;
+ private IntPtr connection;
+ private IedConnection iedConnection = null;
+ private string objectReference;
+ private bool flagRptId = false;
+ private bool flagRptEna = false;
+ private bool flagResv = false;
+ private bool flagDataSetReference = false;
+ private bool flagConfRev = false;
+ private bool flagOptFlds = false;
+ private bool flagBufTm = false;
+ private bool flagSqNum = false;
+ private bool flagTrgOps = false;
+ private bool flagIntgPd = false;
+ private bool flagGI = false;
+ private bool flagPurgeBuf = false;
+ private bool flagResvTms = false;
+ private bool flagEntryId = false;
+
+ private event ReportHandler reportHandler = null;
+ private object reportHandlerParameter;
+ private bool reportHandlerInstalled = false;
+ private event InternalReportHandler internalHandler = null;
+
+ private void resetSendFlags ()
+ {
+ flagRptId = false;
+ flagRptEna = false;
+ flagResv = false;
+ flagDataSetReference = false;
+ flagConfRev = false;
+ flagOptFlds = false;
+ flagBufTm = false;
+ flagSqNum = false;
+ flagTrgOps = false;
+ flagIntgPd = false;
+ flagGI = false;
+ flagPurgeBuf = false;
+ flagResvTms = false;
+ flagEntryId = false;
+ }
+
+ private Report report = null;
+
+ private void internalReportHandler (IntPtr parameter, IntPtr report)
+ {
+ try {
+
+ if (this.report == null)
+ this.report = new Report (report);
+
+ if (reportHandler != null)
+ reportHandler(this.report, reportHandlerParameter);
+
+ } catch (Exception e)
+ {
+ // older versions of mono 2.10 (for linux?) cause this exception
+ Console.WriteLine(e.Message);
+ }
+ }
+
+ internal ReportControlBlock (string objectReference, IedConnection iedConnection, IntPtr connection)
+ {
+ self = ClientReportControlBlock_create (objectReference);
+ this.iedConnection = iedConnection;
+ this.connection = connection;
+ this.objectReference = objectReference;
+ }
+
+ internal void DisposeInternal()
+ {
+ IedConnection_uninstallReportHandler(connection, objectReference);
+ }
+
+ ///
+ /// Releases all resource used by the object.
+ ///
+ /// Call when you are finished using the . The
+ /// method leaves the in an unusable state.
+ /// After calling , you must release all references to the
+ /// so the garbage collector can reclaim the memory that the
+ /// was occupying.
+ public void Dispose()
+ {
+ DisposeInternal ();
+
+ iedConnection.RemoveRCB (this);
+ }
+
+ public string GetObjectReference ()
+ {
+ return this.objectReference;
+ }
+
+ ///
+ /// Installs the report handler.
+ ///
+ ///
+ /// This will install a callback handler (delegate) that is invoked whenever a report
+ /// related this RCB is received. Any call of this method will replace an previously registered
+ /// handler!
+ ///
+ ///
+ /// report handler
+ ///
+ ///
+ /// parameter is passed to the handler when the handler is invoked.
+ ///
+ public void InstallReportHandler (ReportHandler reportHandler, object parameter)
+ {
+ this.reportHandler = new ReportHandler(reportHandler);
+
+ this.reportHandlerParameter = parameter;
+
+ if (reportHandlerInstalled == false) {
+
+ string reportId = this.GetRptId ();
+
+ if (internalHandler == null)
+ {
+ internalHandler = new InternalReportHandler(internalReportHandler);
+ }
+
+ IedConnection_installReportHandler(this.connection, objectReference, reportId, internalHandler, IntPtr.Zero);
+ reportHandlerInstalled = true;
+ }
+ }
+
+ ///
+ /// Read all RCB values from the server
+ ///
+ /// This exception is thrown if there is a connection or service error
+ public void GetRCBValues ()
+ {
+ int error;
+
+ IedConnection_getRCBValues (connection, out error, objectReference, self);
+
+ if (error != 0)
+ throw new IedConnectionException ("getRCBValues service failed", error);
+ }
+
+ ///
+ /// Write changed RCB values to the server.
+ ///
+ ///
+ /// This function will only write the RCB values that were set by one of the setter methods.
+ /// The RCB values are sent by a single MMS write request.
+ ///
+ /// This exception is thrown if there is a connection or service error
+ public void SetRCBValues ()
+ {
+ SetRCBValues (true);
+ }
+
+ ///
+ /// Write changed RCB values to the server.
+ ///
+ ///
+ /// This function will only write the RCB values that were set by one of the setter methods.
+ ///
+ /// This exception is thrown if there is a connection or service error
+ ///
+ /// If true the values are sent by single MMS write request. Otherwise the values are all sent by their own MMS write requests.
+ ///
+ public void SetRCBValues (bool singleRequest)
+ {
+ UInt32 parametersMask = 0;
+
+ if (flagRptId)
+ parametersMask += 1;
+
+ if (flagRptEna)
+ parametersMask += 2;
+
+ if (flagResv)
+ parametersMask += 4;
+
+ if (flagDataSetReference)
+ parametersMask += 8;
+
+ if (flagConfRev)
+ parametersMask += 16;
+
+ if (flagOptFlds)
+ parametersMask += 32;
+
+ if (flagBufTm)
+ parametersMask += 64;
+
+ if (flagSqNum)
+ parametersMask += 128;
+
+ if (flagTrgOps)
+ parametersMask += 256;
+
+ if (flagIntgPd)
+ parametersMask += 512;
+
+ if (flagGI)
+ parametersMask += 1024;
+
+ if (flagPurgeBuf)
+ parametersMask += 2048;
+
+ if (flagEntryId)
+ parametersMask += 4096;
+
+ if (flagResvTms)
+ parametersMask += 16384;
+
+ int error;
+
+ IedConnection_setRCBValues (connection, out error, self, parametersMask, singleRequest);
+
+ if (error != 0)
+ throw new IedConnectionException ("setRCBValues service failed", error);
+
+ if (flagRptId) {
+
+ if (reportHandlerInstalled) {
+ reportHandlerInstalled = false;
+ InstallReportHandler(this.reportHandler, this.reportHandlerParameter);
+ }
+ }
+
+ resetSendFlags();
+ }
+
+ ///
+ /// Determines whether this instance is a buffered or unbuffered RCB.
+ ///
+ ///
+ /// true if this instance is a buffered RCB; otherwise, false.
+ ///
+ public bool IsBuffered ()
+ {
+ return ClientReportControlBlock_isBuffered (self);
+ }
+
+ ///
+ /// Gets the entry time of the RCB as ms time
+ ///
+ ///
+ /// The entry time is the timestamp of the last report sent.
+ ///
+ ///
+ /// The entry time as ms timestamp
+ ///
+ public UInt64 GetEntryTime ()
+ {
+ return ClientReportControlBlock_getEntryTime (self);
+ }
+
+ ///
+ /// Gets the entry time of the RCB as DateTimeOffset
+ ///
+ ///
+ /// The entry time is the timestamp of the last report sent.
+ ///
+ ///
+ /// The entry time as DataTimeOffset
+ ///
+ public DateTimeOffset GetEntryTimeAsDateTimeOffset ()
+ {
+ UInt64 entryTime = GetEntryTime ();
+
+ DateTimeOffset retVal = new DateTimeOffset (1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
+
+ return retVal.AddMilliseconds (entryTime);
+ }
+
+ ///
+ /// Gets the entryID of RCB
+ ///
+ /// Returns the EntryID of the last received GetRCBValues service response.
+ /// The EntryID is only present in buffered RCBs (BRCBs).
+ ///
+ /// The entry ID
+ public byte[] GetEntryID()
+ {
+ IntPtr entryIdRef = ClientReportControlBlock_getEntryId (self);
+
+ if (entryIdRef == IntPtr.Zero)
+ return null;
+ else {
+ MmsValue entryId = new MmsValue (entryIdRef);
+
+ return entryId.getOctetString ();
+ }
+ }
+
+ public void SetEntryID(byte[] entryId)
+ {
+ flagEntryId = true;
+
+
+
+ MmsValue entryID = MmsValue.NewOctetString (entryId.Length);
+
+ entryID.setOctetString (entryId);
+
+ ClientReportControlBlock_setEntryId (self, entryID.valueReference);
+
+
+ }
+
+
+ ///
+ /// Gets the data set reference of the associated data set
+ ///
+ ///
+ /// The data set reference.
+ ///
+ public string GetDataSetReference ()
+ {
+ IntPtr dataSetRefPtr = ClientReportControlBlock_getDataSetReference (self);
+
+ return Marshal.PtrToStringAnsi (dataSetRefPtr);
+ }
+
+ ///
+ /// Sets the data set reference. Use this method to select the associated data set for the RCB
+ ///
+ ///
+ /// The data set reference.
+ ///
+ public void SetDataSetReference (string dataSetReference)
+ {
+ ClientReportControlBlock_setDataSetReference (self, dataSetReference);
+
+ flagDataSetReference = true;
+ }
+
+ ///
+ /// Gets the report identifier.
+ ///
+ ///
+ /// The report identifier.
+ ///
+ public string GetRptId ()
+ {
+ IntPtr rptIdPtr = ClientReportControlBlock_getRptId (self);
+
+ return Marshal.PtrToStringAnsi (rptIdPtr);
+ }
+
+ ///
+ /// Sets the RptId (report ID) of the RCB
+ ///
+ ///
+ /// The new RptId
+ ///
+ public void SetRptId (string rptId)
+ {
+ ClientReportControlBlock_setRptId(self, rptId);
+ flagRptId = true;
+ }
+
+ ///
+ /// Check if reporting is currently enabled
+ ///
+ ///
+ /// true, if reporting is enabled, false otherwise
+ ///
+ public bool GetRptEna ()
+ {
+ return ClientReportControlBlock_getRptEna (self);
+ }
+
+ ///
+ /// Sets report enable flag. Use this to enable reporting
+ ///
+ ///
+ /// true to enable reporting, false to disable
+ ///
+ public void SetRptEna (bool rptEna)
+ {
+ ClientReportControlBlock_setRptEna (self, rptEna);
+ flagRptEna = true;
+ }
+
+ ///
+ /// Get the purgeBuf flag of the report control block
+ ///
+ /// the prugeBuf value
+ public bool GetPurgeBuf ()
+ {
+ return ClientReportControlBlock_getPurgeBuf(self);
+ }
+
+ ///
+ /// Set the purgeBuf flag of the report control block
+ ///
+ /// This is only for buffered RCBs. If set to true the report buffer of a buffered RCB will be cleaned.
+ /// set to true to flush report buffer
+ public void SetPurgeBuf (bool purgeBuf)
+ {
+ ClientReportControlBlock_setPurgeBuf(self, purgeBuf);
+ flagPurgeBuf = true;
+ }
+
+ ///
+ /// Gets the buffer time.
+ ///
+ ///
+ /// The buffer time in ms.
+ ///
+ public UInt32 GetBufTm()
+ {
+ return ClientReportControlBlock_getBufTm (self);
+ }
+
+ ///
+ /// Sets the buffer time.
+ ///
+ ///
+ /// Buffer time is ms.
+ ///
+ public void SetBufTm (UInt32 bufTm)
+ {
+ ClientReportControlBlock_setBufTm (self, bufTm);
+
+ flagBufTm = true;
+ }
+
+ ///
+ /// Gets the GI flag
+ ///
+ ///
+ /// true, if GI flag is set
+ ///
+ public bool GetGI ()
+ {
+ return ClientReportControlBlock_getGI (self);
+ }
+
+ ///
+ /// Sets the GI flag. Use this to trigger a GI (general interrogation) command.
+ ///
+ ///
+ /// request general interrogation of true
+ ///
+ public void SetGI (bool GI)
+ {
+ ClientReportControlBlock_setGI (self, GI);
+ flagGI = true;
+ }
+
+ ///
+ /// Check if RCB is reserved by a client
+ ///
+ ///
+ /// true, the RCB is reserver by a client
+ ///
+ public bool GetResv ()
+ {
+ return ClientReportControlBlock_getResv (self);
+ }
+
+ ///
+ /// Gets the configuration revision of the RCB
+ ///
+ ///
+ /// The conf rev.
+ ///
+ public UInt32 GetConfRev ()
+ {
+ return ClientReportControlBlock_getConfRev (self);
+ }
+
+ ///
+ /// Sets RESV flag. Use this to reserve (allocate) this RCB.
+ ///
+ ///
+ /// true: reserver this RCB for exclusive use
+ ///
+ public void SetResv (bool resv)
+ {
+ ClientReportControlBlock_setResv (self, resv);
+ flagResv = true;
+ }
+
+ ///
+ /// Gets the trigger options of the RCB
+ ///
+ ///
+ /// trigger options
+ ///
+ public TriggerOptions GetTrgOps()
+ {
+ return (TriggerOptions) ClientReportControlBlock_getTrgOps (self);
+ }
+
+ ///
+ /// Sets the trigger options of the RCB.
+ ///
+ ///
+ /// trigger options
+ ///
+ public void SetTrgOps(TriggerOptions trgOps)
+ {
+ ClientReportControlBlock_setTrgOps (self, (int) trgOps);
+
+ flagTrgOps = true;
+ }
+
+ ///
+ /// Gets the integrity period
+ ///
+ ///
+ /// integrity period in ms
+ ///
+ public UInt32 GetIntgPd ()
+ {
+ return ClientReportControlBlock_getIntgPd (self);
+ }
+
+ ///
+ /// Sets the integrity period
+ ///
+ ///
+ /// integrity period in ms
+ ///
+ public void SetIntgPd (UInt32 intgPd)
+ {
+ ClientReportControlBlock_setIntgPd (self, intgPd);
+ flagIntgPd = true;
+ }
+
+ ///
+ /// Gets the option fields.
+ ///
+ ///
+ /// The option fields
+ ///
+ public ReportOptions GetOptFlds()
+ {
+ return (ReportOptions) ClientReportControlBlock_getOptFlds (self);
+ }
+
+ ///
+ /// Sets the option field. Used to enable or disable optional report elements
+ ///
+ ///
+ /// Option field.
+ ///
+ public void SetOptFlds(ReportOptions optFlds)
+ {
+ ClientReportControlBlock_setOptFlds (self, (int)optFlds);
+
+ flagOptFlds = true;
+ }
+ }
+
+ }
+}
diff --git a/dotnet/IEC61850forCSharp/Reporting.cs b/dotnet/IEC61850forCSharp/Reporting.cs
new file mode 100644
index 0000000..dfbf6d6
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/Reporting.cs
@@ -0,0 +1,352 @@
+/*
+ * Reporting.cs
+ *
+ * Copyright 2014 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.
+ */
+using System;
+using System.Runtime.InteropServices;
+
+using IEC61850.Common;
+using System.Collections.Generic;
+
+namespace IEC61850
+{
+ namespace Client
+ {
+ public partial class IedConnection
+ {
+
+ private List activeRCBs = null;
+
+ private void cleanupRCBs()
+ {
+ if (activeRCBs != null) {
+
+ foreach (ReportControlBlock rcb in activeRCBs) {
+ rcb.DisposeInternal ();
+ }
+ }
+
+ }
+
+ public ReportControlBlock GetReportControlBlock (string rcbObjectReference)
+ {
+ var newRCB = new ReportControlBlock (rcbObjectReference, this, connection);
+
+ if (activeRCBs == null)
+ activeRCBs = new List ();
+
+ activeRCBs.Add (newRCB);
+
+ return newRCB;
+ }
+
+ internal void RemoveRCB(ReportControlBlock rcb) {
+ if (activeRCBs != null) {
+ activeRCBs.Remove (rcb);
+ }
+ }
+
+ }
+
+ public enum ReasonForInclusion
+ {
+ /** the element is not included in the received report */
+ REASON_NOT_INCLUDED = 0,
+
+ /** the element is included due to a change of the data value */
+ REASON_DATA_CHANGE = 1,
+
+ /** the element is included due to a change in the quality of data */
+ REASON_QUALITY_CHANGE = 2,
+
+ /** the element is included due to an update of the data value */
+ REASON_DATA_UPDATE = 3,
+
+ /** the element is included due to a periodic integrity report task */
+ REASON_INTEGRITY = 4,
+
+ /** the element is included due to a general interrogation by the client */
+ REASON_GI = 5,
+
+ /** the reason for inclusion is unknown */
+ REASON_UNKNOWN = 6
+ }
+
+ ///
+ /// A class to hold the contents of a received report
+ ///
+ public class Report
+ {
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasTimestamp (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt64 ClientReport_getTimestamp (IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getDataSetValues(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern int ClientReport_getReasonForInclusion(IntPtr self, int elementIndex);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasSeqNum(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt16 ClientReport_getSeqNum(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasDataSetName(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasReasonForInclusion(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasConfRev(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern UInt32 ClientReport_getConfRev(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasBufOvfl(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_getBufOvfl(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ static extern bool ClientReport_hasDataReference(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getRcbReference(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getDataSetName(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getRptId(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getEntryId(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr ClientReport_getDataReference(IntPtr self, int elementIndex);
+
+ private IntPtr self;
+
+ private IntPtr dataSetValues = IntPtr.Zero;
+
+ private MmsValue values = null;
+
+ internal Report (IntPtr self)
+ {
+ this.self = self;
+ }
+
+ ///
+ /// Determines whether the report has a timestamp.
+ ///
+ ///
+ /// true if this report has a timestamp; otherwise, false.
+ ///
+ public bool HasTimestamp ()
+ {
+ return ClientReport_hasTimestamp (self);
+ }
+
+ ///
+ /// Gets the timestamp.
+ ///
+ ///
+ /// The timestamp as milliseconds since 1.1.1970 UTC 00:00 or 0 if no timestamp is present.
+ ///
+ public UInt64 GetTimestamp ()
+ {
+ if (HasTimestamp ())
+ return ClientReport_getTimestamp (self);
+ else
+ return 0;
+ }
+
+ public bool HasDataSetName ()
+ {
+ return ClientReport_hasDataSetName(self);
+ }
+
+ public bool HasDataReference ()
+ {
+ return ClientReport_hasDataReference(self);
+ }
+
+ public bool HasConfRev ()
+ {
+ return ClientReport_hasConfRev(self);
+ }
+
+ public UInt32 GetConfRev ()
+ {
+ return ClientReport_getConfRev(self);
+ }
+
+ public bool HasBufOvfl ()
+ {
+ return ClientReport_hasBufOvfl(self);
+ }
+
+ public bool GetBufOvfl ()
+ {
+ return ClientReport_getBufOvfl(self);
+ }
+
+ public bool HasSeqNum ()
+ {
+ return ClientReport_hasSeqNum(self);
+ }
+
+ public UInt16 GetSeqNum ()
+ {
+ return ClientReport_getSeqNum(self);
+ }
+
+ public bool HasReasonForInclusion ()
+ {
+ return ClientReport_hasReasonForInclusion(self);
+ }
+
+ ///
+ /// Gets the data set values as MMS_ARRAY instance.
+ ///
+ ///
+ /// The data set values.
+ ///
+ public MmsValue GetDataSetValues ()
+ {
+ if (dataSetValues == IntPtr.Zero) {
+ dataSetValues = ClientReport_getDataSetValues(self);
+
+ if (dataSetValues == IntPtr.Zero)
+ throw new IedConnectionException("No report values available yet");
+
+ values = new MmsValue(dataSetValues);
+ }
+
+ return values;
+ }
+
+ ///
+ /// Gets the reason for inclusion of data set member with the given index
+ ///
+ ///
+ /// The reason for inclusion.
+ ///
+ ///
+ /// index of the data set member in the data set
+ ///
+ public ReasonForInclusion GetReasonForInclusion (int index)
+ {
+ if (values == null) {
+ GetDataSetValues ();
+
+ if (values == null)
+ throw new IedConnectionException("No ReasonForInclusion available yet");
+ }
+
+ int dataSetSize = values.Size();
+
+ if (index >= dataSetSize)
+ throw new IedConnectionException("data set index out of range (count = " + dataSetSize + ")");
+
+ return (ReasonForInclusion) ClientReport_getReasonForInclusion(self, index);
+ }
+
+ public string GetRcbReference ()
+ {
+ IntPtr rcbRef = ClientReport_getRcbReference(self);
+
+ return Marshal.PtrToStringAnsi (rcbRef);
+ }
+
+ public string GetDataSetName ()
+ {
+ IntPtr dataSetName = ClientReport_getDataSetName (self);
+
+ return Marshal.PtrToStringAnsi (dataSetName);
+ }
+
+ ///
+ /// Gets the data reference for the specified data set element
+ ///
+ ///
+ /// The data reference or null if the data reference is not available
+ ///
+ ///
+ /// index of the data set element starting with 0
+ ///
+ public string GetDataReference (int index)
+ {
+ IntPtr dataRef = ClientReport_getDataReference(self, index);
+
+ if (dataRef != IntPtr.Zero)
+ return Marshal.PtrToStringAnsi(dataRef);
+ else
+ return null;
+ }
+
+ public string GetRptId ()
+ {
+ IntPtr rptId = ClientReport_getRptId(self);
+
+ if (rptId == IntPtr.Zero)
+ return GetRcbReference();
+ else
+ return Marshal.PtrToStringAnsi (rptId);
+ }
+
+ ///
+ /// Gets the EntryID of this report.
+ ///
+ /// The entryID as a byte array representing an MMS octet string.
+ public byte[] GetEntryId ()
+ {
+ IntPtr entryIdRef = ClientReport_getEntryId (self);
+
+ if (entryIdRef == IntPtr.Zero)
+ return null;
+ else {
+ MmsValue entryId = new MmsValue (entryIdRef);
+
+ return entryId.getOctetString ();
+ }
+ }
+
+ }
+
+ }
+}
+
diff --git a/dotnet/authenticate/AssemblyInfo.cs b/dotnet/authenticate/AssemblyInfo.cs
new file mode 100644
index 0000000..c77a4a9
--- /dev/null
+++ b/dotnet/authenticate/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("authenticate")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/authenticate/Main.cs b/dotnet/authenticate/Main.cs
new file mode 100644
index 0000000..afab952
--- /dev/null
+++ b/dotnet/authenticate/Main.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Client;
+using IEC61850.Common;
+
+namespace authenticate
+{
+ class MainClass
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+
+ try
+ {
+ IsoConnectionParameters parameters = con.GetConnectionParameters();
+
+ parameters.UsePasswordAuthentication("top secret");
+
+ con.Connect(hostname, 102);
+
+ List serverDirectory = con.GetServerDirectory(false);
+
+ foreach (string entry in serverDirectory)
+ {
+ Console.WriteLine("LD: " + entry);
+ }
+
+ con.Release();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
\ No newline at end of file
diff --git a/dotnet/authenticate/authenticate.csproj b/dotnet/authenticate/authenticate.csproj
new file mode 100644
index 0000000..4521ac5
--- /dev/null
+++ b/dotnet/authenticate/authenticate.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {0BECEC77-2315-4B95-AFF9-E6007E644BBF}
+ Exe
+ authenticate
+ authenticate
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/control/AssemblyInfo.cs b/dotnet/control/AssemblyInfo.cs
new file mode 100644
index 0000000..21a7f0d
--- /dev/null
+++ b/dotnet/control/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("control")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/control/ControlExample.cs b/dotnet/control/ControlExample.cs
new file mode 100644
index 0000000..5504f31
--- /dev/null
+++ b/dotnet/control/ControlExample.cs
@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using IEC61850.Common;
+using IEC61850.Client;
+using System.Threading;
+
+
+namespace control
+{
+ class ControlExample
+ {
+ private static void commandTerminationHandler (Object parameter, ControlObject control)
+ {
+ LastApplError lastApplError = control.GetLastApplError();
+ Console.WriteLine("HANDLER CALLED! " + lastApplError.addCause);
+ }
+
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ /* direct control with normal security or SBO with normal security */
+ string objectReference = "simpleIOGenericIO/GGIO1.SPCSO1";
+
+ ControlObject control = con.CreateControlObject(objectReference);
+
+ ControlModel controlModel = control.GetControlModel();
+
+ Console.WriteLine(objectReference + " has control model " + controlModel.ToString());
+
+
+ switch (controlModel) {
+
+ case ControlModel.STATUS_ONLY:
+ Console.WriteLine("Control is status-only!");
+ break;
+
+ case ControlModel.DIRECT_NORMAL:
+ case ControlModel.DIRECT_ENHANCED:
+ if (!control.Operate(true))
+ Console.WriteLine("operate failed!");
+ else
+ Console.WriteLine("operated successfully!");
+ break;
+
+ case ControlModel.SBO_NORMAL:
+ case ControlModel.SBO_ENHANCED:
+
+ if (control.Select()) {
+ if (!control.Operate(true))
+ Console.WriteLine("operate failed!");
+ else
+ Console.WriteLine("operated successfully!");
+ }
+ else
+ Console.WriteLine("Select failed!");
+
+ break;
+ }
+
+ /* direct control with enhanced security */
+ objectReference = "simpleIOGenericIO/GGIO1.SPCSO3";
+ control = con.CreateControlObject(objectReference);
+
+ controlModel = control.GetControlModel();
+ Console.WriteLine(objectReference + " has control model " + controlModel.ToString());
+
+ if (controlModel == ControlModel.DIRECT_ENHANCED) {
+ control.SetCommandTerminationHandler(commandTerminationHandler, null);
+
+ control.Operate(true);
+
+ Thread.Sleep(1000);
+ }
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+
+ }
+ }
+}
diff --git a/dotnet/control/control.csproj b/dotnet/control/control.csproj
new file mode 100644
index 0000000..28c7e79
--- /dev/null
+++ b/dotnet/control/control.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {C351CFA4-E54E-49A1-86CE-69643535541A}
+ Exe
+ control
+ control
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/datasets/AssemblyInfo.cs b/dotnet/datasets/AssemblyInfo.cs
new file mode 100644
index 0000000..4ebf096
--- /dev/null
+++ b/dotnet/datasets/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("datasets")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/datasets/DataSetExample.cs b/dotnet/datasets/DataSetExample.cs
new file mode 100644
index 0000000..727e275
--- /dev/null
+++ b/dotnet/datasets/DataSetExample.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Client;
+using IEC61850.Common;
+
+namespace datasets
+{
+ class DataSetExample
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ List serverDirectory = con.GetServerDirectory(false);
+
+ foreach (string entry in serverDirectory)
+ {
+ Console.WriteLine("LD: " + entry);
+ }
+
+ // create a new data set
+
+ List dataSetElements = new List();
+
+ string dataSetName = "simpleIOGenericIO/UNKNOWN.ds1";
+
+ //string dataSetName = "simpleIOGenericIO/LLN0.ds1";
+
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn1.mag.f[MX]");
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn2.mag.f[MX]");
+
+ con.CreateDataSet(dataSetName, dataSetElements);
+
+ // get the directory of the data set
+ List dataSetDirectory = con.GetDataSetDirectory(dataSetName);
+
+ foreach (string entry in dataSetDirectory)
+ {
+ Console.WriteLine("DS element: " + entry);
+ }
+
+ // read the values of the newly created data set
+ DataSet dataSet = con.ReadDataSetValues(dataSetName, null);
+
+ MmsValue dataSetValues = dataSet.GetValues();
+
+ Console.WriteLine ("Data set contains " + dataSetValues.Size() + " elements");
+
+ foreach (MmsValue value in dataSetValues) {
+ Console.WriteLine(" DS value: " + value + " type: " + value.GetType());
+ }
+
+ // delete the data set
+ con.DeleteDataSet(dataSetName);
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message + " reason: " + e.GetIedClientError().ToString());
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+
+ }
+ }
+}
diff --git a/dotnet/datasets/datasets.csproj b/dotnet/datasets/datasets.csproj
new file mode 100644
index 0000000..1b1240b
--- /dev/null
+++ b/dotnet/datasets/datasets.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}
+ Exe
+ datasets
+ datasets
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/dotnet.sln b/dotnet/dotnet.sln
new file mode 100644
index 0000000..8ea2e27
--- /dev/null
+++ b/dotnet/dotnet.sln
@@ -0,0 +1,123 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IEC61850forCSharp", "IEC61850forCSharp\IEC61850forCSharp.csproj", "{C35D624E-5506-4560-8074-1728F1FA1A4D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "example1", "example1\example1.csproj", "{C616A6DF-831E-443C-9310-3F343A6E3D1A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "model_browsing", "model_browsing\model_browsing.csproj", "{59B85486-F48D-4978-BD35-8F5C3A8288D4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "datasets", "datasets\datasets.csproj", "{D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "control", "control\control.csproj", "{C351CFA4-E54E-49A1-86CE-69643535541A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "reporting", "reporting\reporting.csproj", "{9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "example2", "example2\example2.csproj", "{2A226B6D-1D1F-4BFE-B8CC-158116F71270}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "authenticate", "authenticate\authenticate.csproj", "{0BECEC77-2315-4B95-AFF9-E6007E644BBF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{FBDFE530-DBEB-474B-BA54-9AB287DD57B3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "files", "files\files.csproj", "{77127456-19B9-4D1A-AEF9-40F8D1C5695E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "example3", "example3\example3.csproj", "{5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "report_new_dataset", "report_new_dataset\report_new_dataset.csproj", "{71485F99-2976-45E6-B73D-4946E594C15C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0BECEC77-2315-4B95-AFF9-E6007E644BBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0BECEC77-2315-4B95-AFF9-E6007E644BBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0BECEC77-2315-4B95-AFF9-E6007E644BBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0BECEC77-2315-4B95-AFF9-E6007E644BBF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2A226B6D-1D1F-4BFE-B8CC-158116F71270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A226B6D-1D1F-4BFE-B8CC-158116F71270}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2A226B6D-1D1F-4BFE-B8CC-158116F71270}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2A226B6D-1D1F-4BFE-B8CC-158116F71270}.Release|Any CPU.Build.0 = Release|Any CPU
+ {59B85486-F48D-4978-BD35-8F5C3A8288D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {59B85486-F48D-4978-BD35-8F5C3A8288D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {59B85486-F48D-4978-BD35-8F5C3A8288D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {59B85486-F48D-4978-BD35-8F5C3A8288D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {71485F99-2976-45E6-B73D-4946E594C15C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {71485F99-2976-45E6-B73D-4946E594C15C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {71485F99-2976-45E6-B73D-4946E594C15C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {71485F99-2976-45E6-B73D-4946E594C15C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {77127456-19B9-4D1A-AEF9-40F8D1C5695E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {77127456-19B9-4D1A-AEF9-40F8D1C5695E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {77127456-19B9-4D1A-AEF9-40F8D1C5695E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {77127456-19B9-4D1A-AEF9-40F8D1C5695E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C351CFA4-E54E-49A1-86CE-69643535541A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C351CFA4-E54E-49A1-86CE-69643535541A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C351CFA4-E54E-49A1-86CE-69643535541A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C351CFA4-E54E-49A1-86CE-69643535541A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C616A6DF-831E-443C-9310-3F343A6E3D1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C616A6DF-831E-443C-9310-3F343A6E3D1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C616A6DF-831E-443C-9310-3F343A6E3D1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C616A6DF-831E-443C-9310-3F343A6E3D1A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D5C7DD38-032A-49B6-B74F-FFD9724A8AE4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FBDFE530-DBEB-474B-BA54-9AB287DD57B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FBDFE530-DBEB-474B-BA54-9AB287DD57B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FBDFE530-DBEB-474B-BA54-9AB287DD57B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FBDFE530-DBEB-474B-BA54-9AB287DD57B3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {740DC107-F506-416C-B145-F71649A4A5A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {740DC107-F506-416C-B145-F71649A4A5A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {740DC107-F506-416C-B145-F71649A4A5A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {740DC107-F506-416C-B145-F71649A4A5A0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EDC263E3-0419-4B23-91A4-250EF0A6DD62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EDC263E3-0419-4B23-91A4-250EF0A6DD62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EDC263E3-0419-4B23-91A4-250EF0A6DD62}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EDC263E3-0419-4B23-91A4-250EF0A6DD62}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = IEC61850forCSharp\IEC61850forCSharp.csproj
+ Policies = $0
+ $0.DotNetNamingPolicy = $1
+ $1.DirectoryNamespaceAssociation = None
+ $1.ResourceNamePolicy = FileFormatDefault
+ $0.TextStylePolicy = $2
+ $2.FileWidth = 120
+ $2.TabsToSpaces = False
+ $2.inheritsSet = VisualStudio
+ $2.inheritsScope = text/plain
+ $2.scope = text/plain
+ $0.TextStylePolicy = $3
+ $3.inheritsSet = null
+ $3.scope = text/microsoft-resx
+ $0.XmlFormattingPolicy = $4
+ $4.inheritsSet = null
+ $4.scope = text/microsoft-resx
+ $0.TextStylePolicy = $5
+ $5.inheritsSet = null
+ $5.scope = application/xml
+ $0.XmlFormattingPolicy = $6
+ $6.inheritsSet = Mono
+ $6.inheritsScope = application/xml
+ $6.scope = application/xml
+ $0.StandardHeader = $7
+ $7.Text =
+ $7.IncludeInNewFiles = True
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/dotnet/example1/AssemblyInfo.cs b/dotnet/example1/AssemblyInfo.cs
new file mode 100644
index 0000000..a1fbaff
--- /dev/null
+++ b/dotnet/example1/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("example1")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/example1/Main.cs b/dotnet/example1/Main.cs
new file mode 100644
index 0000000..24de9eb
--- /dev/null
+++ b/dotnet/example1/Main.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Client;
+using IEC61850.Common;
+
+namespace example1
+{
+ class MainClass
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "10.0.2.2";
+
+ Console.WriteLine("Connect to " + hostname);
+
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ List serverDirectory = con.GetServerDirectory(false);
+
+ foreach (string entry in serverDirectory)
+ {
+ Console.WriteLine("LD: " + entry);
+ }
+
+
+ List lnDirectory = con.GetLogicalNodeDirectory("simpleIOGenericIO/LLN0", ACSIClass.ACSI_CLASS_DATA_SET);
+
+ foreach (string entry in lnDirectory)
+ {
+ Console.WriteLine("Dataset: " + entry);
+ }
+
+ string vendor = con.ReadStringValue ("simpleIOGenericIO/LLN0.NamPlt.vendor", FunctionalConstraint.DC);
+ Console.WriteLine ("Vendor: " + vendor);
+
+ /* read FCDO */
+ MmsValue value = con.ReadValue("simpleIOGenericIO/GGIO1.AnIn1", FunctionalConstraint.MX);
+
+ if (value.GetType() == MmsType.MMS_STRUCTURE)
+ {
+ Console.WriteLine("Value is of complex type");
+
+ for (int i = 0; i < value.Size(); i++)
+ {
+ Console.WriteLine(" element: " + value.GetElement(i).GetType());
+ if (value.GetElement(i).GetType() == MmsType.MMS_UTC_TIME)
+ {
+ Console.WriteLine(" -> " + value.GetElement(i).GetUtcTimeAsDateTimeOffset());
+ }
+ }
+ }
+
+ DataSet dataSet = con.ReadDataSetValues("simpleIOGenericIO/LLN0.Events", null);
+
+ Console.WriteLine("Read data set " + dataSet.GetReference());
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ System.Threading.Thread.Sleep(2000);
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/example1/example1.csproj b/dotnet/example1/example1.csproj
new file mode 100644
index 0000000..087f4e6
--- /dev/null
+++ b/dotnet/example1/example1.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {C616A6DF-831E-443C-9310-3F343A6E3D1A}
+ Exe
+ example1
+ example1
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/example2/AssemblyInfo.cs b/dotnet/example2/AssemblyInfo.cs
new file mode 100644
index 0000000..7ad8e13
--- /dev/null
+++ b/dotnet/example2/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("example2")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/example2/WriteValueExample.cs b/dotnet/example2/WriteValueExample.cs
new file mode 100644
index 0000000..eb8b022
--- /dev/null
+++ b/dotnet/example2/WriteValueExample.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using IEC61850.Client;
+using IEC61850.Common;
+
+namespace example2
+{
+ class WriteValueExample
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ float setMagF = con.ReadFloatValue("ied1Inverter/ZINV1.OutWSet.setMag.f", FunctionalConstraint.SP);
+
+ Console.WriteLine("ied1Inverter/ZINV1.OutWSet.setMag.f: " + setMagF);
+
+ setMagF += 1.0f;
+
+ con.WriteValue("ied1Inverter/ZINV1.OutWSet.setMag.f", FunctionalConstraint.SP, new MmsValue(setMagF));
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine("IED connection excepion: " + e.Message);
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/example2/example2.csproj b/dotnet/example2/example2.csproj
new file mode 100644
index 0000000..18f5443
--- /dev/null
+++ b/dotnet/example2/example2.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {2A226B6D-1D1F-4BFE-B8CC-158116F71270}
+ Exe
+ example2
+ example2
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/example3/AssemblyInfo.cs b/dotnet/example3/AssemblyInfo.cs
new file mode 100644
index 0000000..8fa9151
--- /dev/null
+++ b/dotnet/example3/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("example3")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/example3/Main.cs b/dotnet/example3/Main.cs
new file mode 100644
index 0000000..5247bd3
--- /dev/null
+++ b/dotnet/example3/Main.cs
@@ -0,0 +1,51 @@
+using System;
+using IEC61850.Client;
+using System.Collections.Generic;
+
+namespace example3
+{
+ class MainClass
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+
+ try
+ {
+ IsoConnectionParameters parameters = con.GetConnectionParameters();
+
+ parameters.SetRemoteAddresses(1,1, new byte[] {0x00, 0x01, 0x02, 0x03});
+
+ con.ConnectTimeout = 10000;
+
+ con.Connect(hostname, 102);
+
+ List serverDirectory = con.GetServerDirectory(false);
+
+ foreach (string entry in serverDirectory)
+ {
+ Console.WriteLine("LD: " + entry);
+ }
+
+ con.Release();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/example3/example3.csproj b/dotnet/example3/example3.csproj
new file mode 100644
index 0000000..7a1f9d0
--- /dev/null
+++ b/dotnet/example3/example3.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {5E5D0FE0-DF44-48D8-A10E-1FB07D34DEA2}
+ Exe
+ example3
+ example3
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/files/AssemblyInfo.cs b/dotnet/files/AssemblyInfo.cs
new file mode 100644
index 0000000..1133bf6
--- /dev/null
+++ b/dotnet/files/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("files")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/files/FileServicesExample.cs b/dotnet/files/FileServicesExample.cs
new file mode 100644
index 0000000..6aed827
--- /dev/null
+++ b/dotnet/files/FileServicesExample.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Client;
+using IEC61850.Common;
+using System.IO;
+
+namespace files
+{
+ class MainClass
+ {
+ public static void printFiles (IedConnection con, string prefix, string parent)
+ {
+ List files = con.GetFileDirectory (parent);
+
+ foreach (FileDirectoryEntry file in files) {
+ Console.WriteLine(prefix + file.GetFileName() + "\t" + file.GetFileSize() + "\t" +
+ MmsValue.MsTimeToDateTimeOffset(file.GetLastModified()));
+
+ if (file.GetFileName().EndsWith("/")) {
+ printFiles (con, prefix + " ", parent + file.GetFileName());
+ }
+ }
+
+ }
+
+ static bool getFileHandler (object parameter, byte[] data)
+ {
+ Console.WriteLine("received " + data.Length + " bytes");
+
+ BinaryWriter binWriter = (BinaryWriter) parameter;
+
+ binWriter.Write(data);
+
+ return true;
+ }
+
+
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "10.0.2.2";
+
+ Console.WriteLine("Connect to " + hostname);
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ Console.WriteLine ("Files in server root directory:");
+ List serverDirectory = con.GetServerDirectory(true);
+
+ foreach (string entry in serverDirectory) {
+ Console.WriteLine(entry);
+ }
+
+ Console.WriteLine();
+
+ Console.WriteLine ("File directory tree at server:");
+ printFiles(con, "", "");
+ Console.WriteLine();
+
+ string filename = "IEDSERVER.BIN";
+
+ Console.WriteLine("Download file " + filename);
+
+ /* Download file from server and write it to a new local file */
+ FileStream fs = new FileStream(filename, FileMode.Create);
+ BinaryWriter w = new BinaryWriter(fs);
+
+ con.GetFile(filename, new IedConnection.GetFileHandler(getFileHandler), w);
+
+ fs.Close();
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/files/files.csproj b/dotnet/files/files.csproj
new file mode 100644
index 0000000..348f804
--- /dev/null
+++ b/dotnet/files/files.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {77127456-19B9-4D1A-AEF9-40F8D1C5695E}
+ Exe
+ files
+ files
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/model_browsing/AssemblyInfo.cs b/dotnet/model_browsing/AssemblyInfo.cs
new file mode 100644
index 0000000..bf82bd4
--- /dev/null
+++ b/dotnet/model_browsing/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("model_browsing")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/model_browsing/ModelBrowsing.cs b/dotnet/model_browsing/ModelBrowsing.cs
new file mode 100644
index 0000000..1322118
--- /dev/null
+++ b/dotnet/model_browsing/ModelBrowsing.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Client;
+using IEC61850.Common;
+
+///
+/// Example for browsing the data model of a server. Shows logical devices, logical nodes,
+/// data sets and report control blocks
+///
+namespace model_browsing
+{
+ class ModelBrowsing
+ {
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ try
+ {
+ Console.WriteLine("Connect to " + hostname + " ...");
+
+ con.Connect(hostname, 102);
+
+ Console.WriteLine("Connected.");
+
+ MmsConnection mmsCon = con.GetMmsConnection();
+
+ MmsServerIdentity identity = mmsCon.GetServerIdentity();
+
+ Console.WriteLine("Vendor: " + identity.vendorName);
+ Console.WriteLine("Model: " + identity.modelName);
+ Console.WriteLine("Revision: " + identity.revision);
+
+ List serverDirectory = con.GetServerDirectory(false);
+
+ foreach (string ldName in serverDirectory)
+ {
+ Console.WriteLine("LD: " + ldName);
+
+ List lnNames = con.GetLogicalDeviceDirectory(ldName);
+
+ foreach (string lnName in lnNames)
+ {
+ Console.WriteLine(" LN: " + lnName);
+
+ string logicalNodeReference = ldName + "/" + lnName;
+
+ // discover data objects
+ List dataObjects =
+ con.GetLogicalNodeDirectory(logicalNodeReference, ACSIClass.ACSI_CLASS_DATA_OBJECT);
+
+ foreach (string dataObject in dataObjects) {
+ Console.WriteLine(" DO: " + dataObject);
+
+ List dataDirectory = con.GetDataDirectoryFC(logicalNodeReference + "." + dataObject);
+
+ foreach (string dataDirectoryElement in dataDirectory) {
+
+ string daReference = logicalNodeReference + "." + dataObject + "." + ObjectReference.getElementName(dataDirectoryElement);
+
+ // get the type specification of a variable
+ MmsVariableSpecification specification = con.GetVariableSpecification(daReference, ObjectReference.getFC(dataDirectoryElement));
+
+ Console.WriteLine (" DA/SDO: [" + ObjectReference.getFC(dataDirectoryElement) + "] " +
+ ObjectReference.getElementName(dataDirectoryElement) + " : " + specification.GetType()
+ + "(" + specification.Size() + ")");
+
+ if (specification.GetType() == MmsType.MMS_STRUCTURE) {
+ foreach (MmsVariableSpecification elementSpec in specification) {
+ Console.WriteLine(" " + elementSpec.GetName() + " : " + elementSpec.GetType());
+ }
+ }
+ }
+
+ }
+
+ // discover data sets
+ List dataSets =
+ con.GetLogicalNodeDirectory(logicalNodeReference, ACSIClass.ACSI_CLASS_DATA_SET);
+
+ foreach (string dataSet in dataSets) {
+ Console.WriteLine(" Dataset: " + dataSet);
+ }
+
+ // discover unbuffered report control blocks
+ List urcbs =
+ con.GetLogicalNodeDirectory(logicalNodeReference, ACSIClass.ACSI_CLASS_URCB);
+
+ foreach (string urcb in urcbs) {
+ Console.WriteLine(" URCB: " + urcb);
+ }
+
+ // discover buffered report control blocks
+ List brcbs =
+ con.GetLogicalNodeDirectory(logicalNodeReference, ACSIClass.ACSI_CLASS_BRCB);
+
+ foreach (string brcb in brcbs) {
+ Console.WriteLine(" BRCB: " + brcb);
+ }
+
+
+ }
+
+ }
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/model_browsing/model_browsing.csproj b/dotnet/model_browsing/model_browsing.csproj
new file mode 100644
index 0000000..40bd89b
--- /dev/null
+++ b/dotnet/model_browsing/model_browsing.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {59B85486-F48D-4978-BD35-8F5C3A8288D4}
+ Exe
+ model_browsing
+ model_browsing
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/report_new_dataset/AssemblyInfo.cs b/dotnet/report_new_dataset/AssemblyInfo.cs
new file mode 100644
index 0000000..1d974f1
--- /dev/null
+++ b/dotnet/report_new_dataset/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("report_new_dataset")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/report_new_dataset/Main.cs b/dotnet/report_new_dataset/Main.cs
new file mode 100644
index 0000000..9164452
--- /dev/null
+++ b/dotnet/report_new_dataset/Main.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+
+using IEC61850.Common;
+using IEC61850.Client;
+using System.Threading;
+
+namespace report_new_dataset
+{
+ class ReportNewDataSetExample
+ {
+ private static void reportHandler (Report report, object parameter)
+ {
+ Console.WriteLine ("Received report:\n----------------");
+
+ if (report.HasTimestamp ())
+ Console.WriteLine (" timestamp: " + MmsValue.MsTimeToDateTimeOffset (report.GetTimestamp ()).ToString ());
+
+ MmsValue values = report.GetDataSetValues ();
+
+ Console.WriteLine (" report dataset contains " + values.Size () + " elements");
+
+ for (int i = 0; i < values.Size(); i++) {
+ if (report.GetReasonForInclusion(i) != ReasonForInclusion.REASON_NOT_INCLUDED) {
+ Console.WriteLine(" element " + i + " included for reason " + report.GetReasonForInclusion(i).ToString() + " " + values.GetElement(i));
+ }
+ }
+ }
+
+ private static bool running = true;
+
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args[0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine("Connect to " + hostname);
+
+ try
+ {
+ con.Connect(hostname, 102);
+
+ // create a new data set
+
+ List dataSetElements = new List();
+
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn1.mag.f[MX]");
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn2.mag.f[MX]");
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn3.mag.f[MX]");
+ dataSetElements.Add("simpleIOGenericIO/GGIO1.AnIn4.mag.f[MX]");
+
+ // permanent (domain specific) data set
+ //string dataSetReference = "simpleIOGenericIO/LLN0.ds1";
+
+ // temporary (association specific) data set
+ string dataSetReference = "@newds";
+
+ // Note: this function will throw an exception when a data set with the same name already exists
+ con.CreateDataSet(dataSetReference, dataSetElements);
+
+ // reconfigure existing RCB with new data set
+
+ string rcbReference = "simpleIOGenericIO/LLN0.RP.EventsRCB01";
+
+ ReportControlBlock rcb = con.GetReportControlBlock(rcbReference);
+
+ rcb.GetRCBValues();
+
+ // note: the second parameter is not required!
+ rcb.InstallReportHandler(reportHandler, rcb);
+
+ string rcbDataSetReference = dataSetReference.Replace('.', '$');
+
+ rcb.SetDataSetReference(rcbDataSetReference);
+ rcb.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY);
+ rcb.SetIntgPd(5000);
+ rcb.SetRptEna(true);
+
+ rcb.SetRCBValues();
+
+ /* run until Ctrl-C is pressed */
+ Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {
+ e.Cancel = true;
+ running = false;
+ };
+
+ while (running) {
+ Thread.Sleep(1000);
+ }
+
+ // delete the data set
+ con.DeleteDataSet(dataSetReference);
+
+ con.Abort();
+ }
+ catch (IedConnectionException e)
+ {
+ Console.WriteLine(e.Message + " reason: " + e.GetIedClientError().ToString());
+ }
+
+ // release all resources - do NOT use the object after this call!!
+ con.Dispose ();
+ }
+ }
+}
diff --git a/dotnet/report_new_dataset/report_new_dataset.csproj b/dotnet/report_new_dataset/report_new_dataset.csproj
new file mode 100644
index 0000000..e33af7a
--- /dev/null
+++ b/dotnet/report_new_dataset/report_new_dataset.csproj
@@ -0,0 +1,45 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {71485F99-2976-45E6-B73D-4946E594C15C}
+ Exe
+ report_new_dataset
+ report_new_dataset
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/dotnet/reporting/AssemblyInfo.cs b/dotnet/reporting/AssemblyInfo.cs
new file mode 100644
index 0000000..a58c9ab
--- /dev/null
+++ b/dotnet/reporting/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("reporting")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("mzillgit")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/dotnet/reporting/ReportingExample.cs b/dotnet/reporting/ReportingExample.cs
new file mode 100644
index 0000000..9857194
--- /dev/null
+++ b/dotnet/reporting/ReportingExample.cs
@@ -0,0 +1,161 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+using IEC61850.Client;
+using IEC61850.Common;
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
+
+namespace reporting
+{
+ class ReportingExample
+ {
+
+ private static void reportHandler (Report report, object parameter)
+ {
+ Console.WriteLine ("Received report:\n----------------");
+
+ Console.WriteLine (" for RCB: " + report.GetRcbReference());
+
+ if (report.HasTimestamp ())
+ Console.WriteLine (" timestamp: " + MmsValue.MsTimeToDateTimeOffset (report.GetTimestamp ()).ToString ());
+
+ MmsValue values = report.GetDataSetValues ();
+
+ byte[] entryId = report.GetEntryId ();
+
+ if (entryId != null) {
+ SoapHexBinary shb = new SoapHexBinary(entryId);
+
+ Console.WriteLine (" entryID: " + shb.ToString ());
+ }
+
+ if (report.HasDataSetName ()) {
+ Console.WriteLine (" report data set: " + report.GetDataSetName ());
+ }
+
+ Console.WriteLine (" report dataset contains " + values.Size () + " elements");
+
+ for (int i = 0; i < values.Size(); i++) {
+ if (report.GetReasonForInclusion(i) != ReasonForInclusion.REASON_NOT_INCLUDED) {
+ Console.WriteLine(" element " + i + " included for reason " + report.GetReasonForInclusion(i).ToString() + " " + values.GetElement(i));
+ }
+
+ if (report.HasDataReference()) {
+ Console.WriteLine(" data-ref: " + report.GetDataReference(i));
+ }
+
+ }
+
+ ReportControlBlock rcb = (ReportControlBlock) parameter;
+
+ Console.WriteLine(" For RCB: " + rcb.GetObjectReference() + " Buffered: " + rcb.IsBuffered() +
+ " data-set: " + rcb.GetDataSetReference ());
+
+ }
+
+
+ private static bool running = true;
+
+ public static void Main (string[] args)
+ {
+ IedConnection con = new IedConnection ();
+
+ string hostname;
+
+ if (args.Length > 0)
+ hostname = args [0];
+ else
+ hostname = "localhost";
+
+ Console.WriteLine ("Connect to " + hostname);
+
+ try {
+ con.Connect (hostname, 102);
+
+ string rcbReference1 = "simpleIOGenericIO/LLN0.RP.EventsRCB01";
+ string rcbReference2 = "simpleIOGenericIO/LLN0.RP.EventsIndexed01";
+ string rcbReference3 = "simpleIOGenericIO/LLN0.BR.Measurements01";
+
+ ReportControlBlock rcb1 = con.GetReportControlBlock(rcbReference1);
+ ReportControlBlock rcb2 = con.GetReportControlBlock(rcbReference2);
+ ReportControlBlock rcb3 = con.GetReportControlBlock(rcbReference3);
+
+ rcb1.GetRCBValues();
+
+ // note: the second parameter is not required!
+ rcb1.InstallReportHandler(reportHandler, rcb1);
+
+ if (rcb1.IsBuffered())
+ Console.WriteLine("RCB: " + rcbReference1 + " is buffered");
+
+ rcb1.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY);
+ rcb1.SetIntgPd(5000);
+ rcb1.SetRptEna(true);
+
+ rcb1.SetRCBValues();
+
+ rcb2.GetRCBValues();
+
+ if (rcb2.IsBuffered())
+ Console.WriteLine("RCB: " + rcbReference2 + " is buffered");
+
+ rcb2.InstallReportHandler(reportHandler, rcb2);
+
+ rcb2.SetOptFlds(ReportOptions.REASON_FOR_INCLUSION | ReportOptions.SEQ_NUM | ReportOptions.TIME_STAMP |
+ ReportOptions.CONF_REV | ReportOptions.ENTRY_ID | ReportOptions.DATA_REFERENCE | ReportOptions.DATA_SET);
+ rcb2.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY);
+ rcb2.SetIntgPd(2000);
+ rcb2.SetRptEna(true);
+
+ rcb2.SetRCBValues();
+
+ rcb3.GetRCBValues();
+
+ if (rcb3.IsBuffered())
+ Console.WriteLine ("RCB: " + rcbReference3 + " is buffered");
+
+ rcb3.InstallReportHandler(reportHandler, rcb2);
+
+ rcb3.SetOptFlds(ReportOptions.REASON_FOR_INCLUSION | ReportOptions.SEQ_NUM | ReportOptions.TIME_STAMP |
+ ReportOptions.CONF_REV | ReportOptions.ENTRY_ID | ReportOptions.DATA_REFERENCE | ReportOptions.DATA_SET);
+ rcb3.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY);
+ rcb3.SetIntgPd(2000);
+ rcb3.SetRptEna(true);
+
+ rcb3.SetRCBValues();
+
+
+ /* run until Ctrl-C is pressed */
+ Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {
+ e.Cancel = true;
+ ReportingExample.running = false;
+ };
+
+ /* stop main loop when connection is lost */
+ con.InstallConnectionClosedHandler(delegate(IedConnection connection) {
+ Console.WriteLine("Connection closed");
+ ReportingExample.running = false;
+ });
+
+ while (running) {
+ Thread.Sleep(10);
+ }
+
+ /* Dispose the RCBs when you no longer need them */
+ rcb1.Dispose();
+ rcb2.Dispose();
+ rcb3.Dispose();
+
+ con.Abort ();
+
+ con.Dispose();
+ } catch (IedConnectionException e) {
+ Console.WriteLine ("Error: " + e.Message);
+
+ con.Dispose ();
+ }
+
+ }
+ }
+}
diff --git a/dotnet/reporting/reporting.csproj b/dotnet/reporting/reporting.csproj
new file mode 100644
index 0000000..319ba36
--- /dev/null
+++ b/dotnet/reporting/reporting.csproj
@@ -0,0 +1,95 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8}
+ Exe
+ reporting
+ reporting
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ true
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 4.5
+ true
+
+
+
\ No newline at end of file
diff --git a/dotnet/tests/Test.cs b/dotnet/tests/Test.cs
new file mode 100644
index 0000000..c5b03c0
--- /dev/null
+++ b/dotnet/tests/Test.cs
@@ -0,0 +1,79 @@
+using NUnit.Framework;
+using System;
+using IEC61850.Common;
+using IEC61850.Client;
+
+namespace tests
+{
+ [TestFixture ()]
+ public class Test
+ {
+ [Test ()]
+ public void TestCase ()
+ {
+ var val = new MmsValue (10.0f);
+
+ Assert.AreEqual (10.0f, val.ToFloat ());
+ }
+
+ [Test ()]
+ public void MmsValueBitString ()
+ {
+ var val = MmsValue.NewBitString(10);
+
+ Assert.AreEqual (MmsType.MMS_BIT_STRING, val.GetType());
+ Assert.AreEqual (10, val.Size());
+
+ val.BitStringFromUInt32(7);
+
+ Assert.AreEqual(7, val.BitStringToUInt32());
+
+ Assert.AreEqual(true, val.GetBit(0));
+ Assert.AreEqual(true, val.GetBit(1));
+ Assert.AreEqual(true, val.GetBit(2));
+ Assert.AreEqual(false, val.GetBit(3));
+
+ Assert.AreEqual(false, val.GetBit(9));
+
+ Assert.AreEqual(false, val.GetBit(10));
+
+ val.SetBit(3, true);
+ Assert.AreEqual(true, val.GetBit(3));
+
+ Assert.AreEqual(15, val.BitStringToUInt32());
+
+ val.SetBit(3, false);
+ Assert.AreEqual(7, val.BitStringToUInt32());
+ }
+
+ [Test()]
+ public void MmsValueOctetString ()
+ {
+ var val = MmsValue.NewOctetString(20);
+
+ Assert.AreEqual (0, val.Size());
+ Assert.AreEqual (20, val.MaxSize());
+
+ byte[] octetString = val.getOctetString();
+
+ Assert.AreEqual (0, octetString.Length);
+
+ octetString = new byte[5];
+ octetString[0] = 0x11;
+ octetString[1] = 0x12;
+ octetString[2] = 0x13;
+ octetString[3] = 0x14;
+ octetString[4] = 0x15;
+
+ val.setOctetString(octetString);
+
+ Assert.AreEqual(5, val.Size());
+
+ byte[] secondOctetString = val.getOctetString();
+
+ Assert.AreEqual(octetString, secondOctetString);
+ }
+
+ }
+}
+
diff --git a/dotnet/tests/tests.csproj b/dotnet/tests/tests.csproj
new file mode 100644
index 0000000..76e97b7
--- /dev/null
+++ b/dotnet/tests/tests.csproj
@@ -0,0 +1,47 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {FBDFE530-DBEB-474B-BA54-9AB287DD57B3}
+ Library
+ tests
+ tests
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+ nunit
+
+
+
+
+
+
+
+
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ IEC61850forCSharp
+
+
+
\ No newline at end of file
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 0000000..5bc51cf
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,25 @@
+add_subdirectory(server_example1)
+add_subdirectory(server_example2)
+add_subdirectory(server_example3)
+add_subdirectory(server_example4)
+add_subdirectory(server_example5)
+add_subdirectory(server_example_goose)
+add_subdirectory(server_example_control)
+add_subdirectory(server_example_dynamic)
+add_subdirectory(server_example_config_file)
+add_subdirectory(server_example_complex_array)
+add_subdirectory(server_example_threadless)
+add_subdirectory(server_example_61400_25)
+add_subdirectory(server_example_setting_groups)
+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)
+add_subdirectory(iec61850_client_example_files)
+add_subdirectory(iec61850_client_example_reporting)
+add_subdirectory(goose_subscriber)
+add_subdirectory(mms_client_example1)
+add_subdirectory(mms_client_example2)
+add_subdirectory(mms_client_example3)
+add_subdirectory(mms_client_example4)
diff --git a/examples/Makefile b/examples/Makefile
new file mode 100644
index 0000000..61f781e
--- /dev/null
+++ b/examples/Makefile
@@ -0,0 +1,53 @@
+
+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_example2
+EXAMPLE_DIRS += iec61850_client_example3
+EXAMPLE_DIRS += iec61850_client_example4
+EXAMPLE_DIRS += iec61850_client_example5
+EXAMPLE_DIRS += iec61850_client_example_reporting
+EXAMPLE_DIRS += server_example1
+EXAMPLE_DIRS += server_example2
+EXAMPLE_DIRS += server_example3
+EXAMPLE_DIRS += server_example4
+EXAMPLE_DIRS += server_example5
+EXAMPLE_DIRS += server_example_goose
+EXAMPLE_DIRS += server_example_control
+EXAMPLE_DIRS += server_example_config_file
+EXAMPLE_DIRS += server_example_dynamic
+EXAMPLE_DIRS += server_example_complex_array
+EXAMPLE_DIRS += server_example_61400_25
+EXAMPLE_DIRS += server_example_threadless
+EXAMPLE_DIRS += server_example_setting_groups
+EXAMPLE_DIRS += goose_subscriber
+EXAMPLE_DIRS += goose_publisher
+EXAMPLE_DIRS += mms_utility
+
+MODEL_DIRS += server_example1
+MODEL_DIRS += server_example2
+MODEL_DIRS += server_example3
+MODEL_DIRS += server_example4
+MODEL_DIRS += server_example5
+MODEL_DIRS += server_example_goose
+MODEL_DIRS += server_example_control
+MODEL_DIRS += server_example_config_file
+MODEL_DIRS += server_example_complex_array
+MODEL_DIRS += server_example_61400_25
+MODEL_DIRS += server_example_threadless
+MODEL_DIRS += server_example_setting_groups
+
+all: examples
+
+model:
+ -for d in $(MODEL_DIRS); do(cd $$d && $(MAKE) model); done
+
+examples:
+ -for d in $(EXAMPLE_DIRS); do(cd $$d && $(MAKE)); done
+
+clean:
+ -for d in $(EXAMPLE_DIRS); do(cd $$d && $(MAKE) clean); done
+
diff --git a/examples/goose_publisher/Makefile b/examples/goose_publisher/Makefile
new file mode 100644
index 0000000..f3d5a8f
--- /dev/null
+++ b/examples/goose_publisher/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = goose_publisher_example
+PROJECT_SOURCES = goose_publisher_example.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/goose_publisher/goose_publisher_example.c b/examples/goose_publisher/goose_publisher_example.c
new file mode 100644
index 0000000..1b6c010
--- /dev/null
+++ b/examples/goose_publisher/goose_publisher_example.c
@@ -0,0 +1,60 @@
+/*
+ * goose_publisher_example.c
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "mms_value.h"
+#include "goose_publisher.h"
+#include "hal_thread.h"
+
+// has to be executed as root!
+int
+main(int argc, char** argv)
+{
+
+ LinkedList dataSetValues = LinkedList_create();
+
+ LinkedList_add(dataSetValues, MmsValue_newIntegerFromInt32(1234));
+ LinkedList_add(dataSetValues, MmsValue_newBinaryTime(false));
+ LinkedList_add(dataSetValues, MmsValue_newIntegerFromInt32(5678));
+
+ CommParameters gooseCommParameters;
+
+ gooseCommParameters.appId = 1000;
+ gooseCommParameters.dstAddress[0] = 0x01;
+ gooseCommParameters.dstAddress[1] = 0x0c;
+ gooseCommParameters.dstAddress[2] = 0xcd;
+ gooseCommParameters.dstAddress[3] = 0x01;
+ gooseCommParameters.dstAddress[4] = 0x00;
+ gooseCommParameters.dstAddress[5] = 0x01;
+ gooseCommParameters.vlanId = 0;
+ gooseCommParameters.vlanPriority = 4;
+
+ GoosePublisher publisher = GoosePublisher_create(&gooseCommParameters, "eth0");
+
+ GoosePublisher_setGoCbRef(publisher, "simpleIOGenericIO/LLN0$GO$gcbAnalogValues");
+ GoosePublisher_setConfRev(publisher, 1);
+ GoosePublisher_setDataSetRef(publisher, "simpleIOGenericIO/LLN0$AnalogValues");
+
+ int i = 0;
+
+ for (i = 0; i < 3; i++) {
+ Thread_sleep(1000);
+
+ if (GoosePublisher_publish(publisher, dataSetValues) == -1) {
+ printf("Error sending message!\n");
+ }
+ }
+
+ GoosePublisher_destroy(publisher);
+}
+
+
+
+
diff --git a/examples/goose_subscriber/CMakeLists.txt b/examples/goose_subscriber/CMakeLists.txt
new file mode 100644
index 0000000..91724d2
--- /dev/null
+++ b/examples/goose_subscriber/CMakeLists.txt
@@ -0,0 +1,34 @@
+
+set(goose_subscriber_example_SRCS
+ goose_subscriber_example.c
+)
+
+IF(WIN32)
+
+IF(WITH_WPCAP)
+
+set_source_files_properties(${goose_subscriber_example_SRCS}
+ PROPERTIES LANGUAGE CXX)
+add_executable(goose_subscriber_example
+ ${goose_subscriber_example_SRCS}
+)
+
+target_link_libraries(goose_subscriber_example
+ iec61850
+)
+
+ENDIF(WITH_WPCAP)
+
+ELSE(WIN32)
+
+add_executable(goose_subscriber_example
+ ${goose_subscriber_example_SRCS}
+)
+
+target_link_libraries(goose_subscriber_example
+ iec61850
+)
+
+ENDIF(WIN32)
+
+
diff --git a/examples/goose_subscriber/Makefile b/examples/goose_subscriber/Makefile
new file mode 100644
index 0000000..db54412
--- /dev/null
+++ b/examples/goose_subscriber/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = goose_subscriber_example
+PROJECT_SOURCES = goose_subscriber_example.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/goose_subscriber/goose_subscriber_example.c b/examples/goose_subscriber/goose_subscriber_example.c
new file mode 100644
index 0000000..4295f47
--- /dev/null
+++ b/examples/goose_subscriber/goose_subscriber_example.c
@@ -0,0 +1,81 @@
+/*
+ * goose_subscriber_example.c
+ *
+ * This is an example for a standalone GOOSE subscriber
+ *
+ * Has to be started as root in Linux.
+ */
+
+#include "goose_receiver.h"
+#include "hal_thread.h"
+
+#include
+#include
+#include
+
+
+static int running = 1;
+
+void sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+void
+gooseListener(GooseSubscriber subscriber, void* parameter)
+{
+ printf("GOOSE event:\n");
+ printf(" stNum: %u sqNum: %u\n", GooseSubscriber_getStNum(subscriber),
+ GooseSubscriber_getSqNum(subscriber));
+ printf(" timeToLive: %u\n", GooseSubscriber_getTimeAllowedToLive(subscriber));
+ printf(" timestamp: %llu\n", GooseSubscriber_getTimestamp(subscriber));
+
+ MmsValue* values = GooseSubscriber_getDataSetValues(subscriber);
+
+ char buffer[1024];
+
+ MmsValue_printToBuffer(values, buffer, 1024);
+
+ printf("%s\n", buffer);
+}
+
+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) {
+ printf("Set interface id: %s\n", argv[1]);
+ GooseReceiver_setInterfaceId(receiver, argv[1]);
+ }
+ else {
+ printf("Using interface eth0\n");
+ GooseReceiver_setInterfaceId(receiver, "eth0");
+ }
+
+ GooseSubscriber subscriber = GooseSubscriber_create("simpleIOGenericIO/LLN0$GO$gcbAnalogValues", NULL);
+
+ GooseSubscriber_setAppId(subscriber, 1000);
+
+ GooseSubscriber_setListener(subscriber, gooseListener, NULL);
+
+ GooseReceiver_addSubscriber(receiver, subscriber);
+
+ GooseReceiver_start(receiver);
+
+ signal(SIGINT, sigint_handler);
+
+ while (running) {
+ Thread_sleep(100);
+ }
+
+ GooseSubscriber_destroy(subscriber);
+}
diff --git a/examples/iec61850_client_example1/CMakeLists.txt b/examples/iec61850_client_example1/CMakeLists.txt
new file mode 100644
index 0000000..7d8b750
--- /dev/null
+++ b/examples/iec61850_client_example1/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example1_SRCS
+ client_example1.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example1_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example1
+ ${iec61850_client_example1_SRCS}
+)
+
+target_link_libraries(iec61850_client_example1
+ iec61850
+)
diff --git a/examples/iec61850_client_example1/Makefile b/examples/iec61850_client_example1/Makefile
new file mode 100644
index 0000000..4e15977
--- /dev/null
+++ b/examples/iec61850_client_example1/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example1
+PROJECT_SOURCES = 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/iec61850_client_example1/client_example1.c b/examples/iec61850_client_example1/client_example1.c
new file mode 100644
index 0000000..1eb9444
--- /dev/null
+++ b/examples/iec61850_client_example1/client_example1.c
@@ -0,0 +1,131 @@
+/*
+ * client_example1.c
+ *
+ * This example is intended to be used with server_example3 or server_example_goose.
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+
+#include "hal_thread.h"
+
+void
+reportCallbackFunction(void* parameter, ClientReport report)
+{
+ MmsValue* dataSetValues = ClientReport_getDataSetValues(report);
+
+ printf("received report for %s\n", ClientReport_getRcbReference(report));
+
+ int i;
+ for (i = 0; i < 4; i++) {
+ ReasonForInclusion reason = ClientReport_getReasonForInclusion(report, i);
+
+ if (reason != REASON_NOT_INCLUDED) {
+ printf(" GGIO1.SPCSO%i.stVal: %i (included for reason %i)\n", i,
+ MmsValue_getBoolean(MmsValue_getElement(dataSetValues, i)), reason);
+ }
+ }
+}
+
+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) {
+
+ /* read an analog measurement value from server */
+ MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX);
+
+ if (value != NULL) {
+ float fval = MmsValue_toFloat(value);
+ printf("read float value: %f\n", fval);
+ MmsValue_delete(value);
+ }
+
+ /* write a variable to the server */
+ value = MmsValue_newVisibleString("libiec61850.com");
+ IedConnection_writeObject(con, &error, "simpleIOGenericIO/GGIO1.NamPlt.vendor", IEC61850_FC_DC, value);
+
+ if (error != IED_ERROR_OK)
+ printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n");
+ else
+ MmsValue_delete(value);
+
+
+ /* read data set */
+ ClientDataSet clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL);
+
+ if (clientDataSet == NULL)
+ printf("failed to read dataset\n");
+
+ /* Read RCB values */
+ ClientReportControlBlock rcb =
+ IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL);
+
+
+ bool rptEna = ClientReportControlBlock_getRptEna(rcb);
+
+ printf("RptEna = %i\n", rptEna);
+
+ /* Install handler for reports */
+ IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB01",
+ ClientReportControlBlock_getRptId(rcb), reportCallbackFunction, NULL);
+
+ /* Set trigger options and enable report */
+ ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_DATA_UPDATE | TRG_OPT_INTEGRITY | TRG_OPT_GI);
+ ClientReportControlBlock_setRptEna(rcb, true);
+ ClientReportControlBlock_setIntgPd(rcb, 5000);
+ IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_TRG_OPS | RCB_ELEMENT_INTG_PD, true);
+
+ if (error != IED_ERROR_OK)
+ printf("report activation failed (code: %i)\n", error);
+
+ Thread_sleep(1000);
+
+ /* 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);
+
+ Thread_sleep(60000);
+
+ /* disable reporting */
+ ClientReportControlBlock_setRptEna(rcb, false);
+ IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true);
+
+ if (error != IED_ERROR_OK)
+ printf("disable reporting failed (code: %i)\n", error);
+
+ ClientDataSet_destroy(clientDataSet);
+
+ close_connection:
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Failed to connect to %s:%i\n", hostname, tcpPort);
+ }
+
+ IedConnection_destroy(con);
+}
+
+
diff --git a/examples/iec61850_client_example2/CMakeLists.txt b/examples/iec61850_client_example2/CMakeLists.txt
new file mode 100644
index 0000000..f9deba0
--- /dev/null
+++ b/examples/iec61850_client_example2/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example2_SRCS
+ client_example2.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example2_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example2
+ ${iec61850_client_example2_SRCS}
+)
+
+target_link_libraries(iec61850_client_example2
+ iec61850
+)
diff --git a/examples/iec61850_client_example2/Makefile b/examples/iec61850_client_example2/Makefile
new file mode 100644
index 0000000..10e5626
--- /dev/null
+++ b/examples/iec61850_client_example2/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example2
+PROJECT_SOURCES = 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/iec61850_client_example2/client_example2.c b/examples/iec61850_client_example2/client_example2.c
new file mode 100644
index 0000000..d199d0a
--- /dev/null
+++ b/examples/iec61850_client_example2/client_example2.c
@@ -0,0 +1,202 @@
+/*
+ * client_example2.c
+ *
+ * This example shows how to browse the data model of an unknown device.
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+
+void
+printSpaces(int spaces)
+{
+ int i;
+
+ for (i = 0; i < spaces; i++)
+ printf(" ");
+}
+
+void
+printDataDirectory(char* doRef, IedConnection con, int spaces)
+{
+ IedClientError error;
+
+ LinkedList dataAttributes = IedConnection_getDataDirectory(con, &error, doRef);
+
+ //LinkedList dataAttributes = IedConnection_getDataDirectoryByFC(con, &error, doRef, MX);
+
+ if (dataAttributes != NULL) {
+ LinkedList dataAttribute = LinkedList_getNext(dataAttributes);
+
+ while (dataAttribute != NULL) {
+ char* daName = (char*) dataAttribute->data;
+
+ printSpaces(spaces);
+ printf("DA: %s\n", (char*) dataAttribute->data);
+
+ dataAttribute = LinkedList_getNext(dataAttribute);
+
+ char daRef[129];
+ sprintf(daRef, "%s.%s", doRef, daName);
+ printDataDirectory(daRef, con, spaces + 2);
+ }
+
+ }
+}
+
+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) {
+
+ printf("Get logical device list...\n");
+ LinkedList deviceList = IedConnection_getLogicalDeviceList(con, &error);
+
+ if (error != IED_ERROR_OK) {
+ printf("Failed to read device list (error code: %i)\n", error);
+ goto cleanup_and_exit;
+ }
+
+ LinkedList device = LinkedList_getNext(deviceList);
+
+ while (device != NULL) {
+ printf("LD: %s\n", (char*) device->data);
+
+ LinkedList logicalNodes = IedConnection_getLogicalDeviceDirectory(con, &error,
+ (char*) device->data);
+
+ LinkedList logicalNode = LinkedList_getNext(logicalNodes);
+
+ while (logicalNode != NULL) {
+ printf(" LN: %s\n", (char*) logicalNode->data);
+
+ char lnRef[129];
+
+ sprintf(lnRef, "%s/%s", (char*) device->data, (char*) logicalNode->data);
+
+ LinkedList dataObjects = IedConnection_getLogicalNodeDirectory(con, &error,
+ lnRef, ACSI_CLASS_DATA_OBJECT);
+
+ LinkedList dataObject = LinkedList_getNext(dataObjects);
+
+ while (dataObject != NULL) {
+ char* dataObjectName = (char*) dataObject->data;
+
+ printf(" DO: %s\n", dataObjectName);
+
+ dataObject = LinkedList_getNext(dataObject);
+
+ char doRef[129];
+
+ sprintf(doRef, "%s/%s.%s", (char*) device->data, (char*) logicalNode->data, dataObjectName);
+
+ printDataDirectory(doRef, con, 6);
+ }
+
+ LinkedList_destroy(dataObjects);
+
+ LinkedList dataSets = IedConnection_getLogicalNodeDirectory(con, &error, lnRef,
+ ACSI_CLASS_DATA_SET);
+
+ LinkedList dataSet = LinkedList_getNext(dataSets);
+
+ while (dataSet != NULL) {
+ char* dataSetName = (char*) dataSet->data;
+ bool isDeletable;
+ char dataSetRef[129];
+ sprintf(dataSetRef, "%s.%s", lnRef, dataSetName);
+
+ LinkedList dataSetMembers = IedConnection_getDataSetDirectory(con, &error, dataSetRef,
+ &isDeletable);
+
+ if (isDeletable)
+ printf(" Data set: %s (deletable)\n", dataSetName);
+ else
+ printf(" Data set: %s (not deletable)\n", dataSetName);
+
+ LinkedList dataSetMemberRef = LinkedList_getNext(dataSetMembers);
+
+ while (dataSetMemberRef != NULL) {
+
+ char* memberRef = (char*) dataSetMemberRef->data;
+
+ printf(" %s\n", memberRef);
+
+ dataSetMemberRef = LinkedList_getNext(dataSetMemberRef);
+ }
+
+ dataSet = LinkedList_getNext(dataSet);
+ }
+
+ LinkedList_destroy(dataSets);
+
+ LinkedList reports = IedConnection_getLogicalNodeDirectory(con, &error, lnRef,
+ ACSI_CLASS_URCB);
+
+ LinkedList report = LinkedList_getNext(reports);
+
+ while (report != NULL) {
+ char* reportName = (char*) report->data;
+
+ printf(" RP: %s\n", reportName);
+
+ report = LinkedList_getNext(report);
+ }
+
+ LinkedList_destroy(reports);
+
+ reports = IedConnection_getLogicalNodeDirectory(con, &error, lnRef,
+ ACSI_CLASS_BRCB);
+
+ report = LinkedList_getNext(reports);
+
+ while (report != NULL) {
+ char* reportName = (char*) report->data;
+
+ printf(" BR: %s\n", reportName);
+
+ report = LinkedList_getNext(report);
+ }
+
+ LinkedList_destroy(reports);
+
+ logicalNode = LinkedList_getNext(logicalNode);
+ }
+
+ LinkedList_destroy(logicalNodes);
+
+ device = LinkedList_getNext(device);
+ }
+
+ LinkedList_destroy(deviceList);
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Connection failed!\n");
+ }
+
+cleanup_and_exit:
+ IedConnection_destroy(con);
+}
+
diff --git a/examples/iec61850_client_example3/CMakeLists.txt b/examples/iec61850_client_example3/CMakeLists.txt
new file mode 100644
index 0000000..37b61ff
--- /dev/null
+++ b/examples/iec61850_client_example3/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example3_SRCS
+ client_example3.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example3_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example3
+ ${iec61850_client_example3_SRCS}
+)
+
+target_link_libraries(iec61850_client_example3
+ iec61850
+)
diff --git a/examples/iec61850_client_example3/Makefile b/examples/iec61850_client_example3/Makefile
new file mode 100644
index 0000000..138d497
--- /dev/null
+++ b/examples/iec61850_client_example3/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example3
+PROJECT_SOURCES = 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/iec61850_client_example3/client_example3.c b/examples/iec61850_client_example3/client_example3.c
new file mode 100644
index 0000000..9c2e014
--- /dev/null
+++ b/examples/iec61850_client_example3/client_example3.c
@@ -0,0 +1,217 @@
+/*
+ * client_example3.c
+ *
+ * How to control a device ... intended to be used with server_example_control
+ */
+
+#include "iec61850_client.h"
+#include "hal_thread.h"
+
+#include
+#include
+
+static void commandTerminationHandler(void *parameter, ControlObjectClient connection)
+{
+
+
+ LastApplError lastApplError = ControlObjectClient_getLastApplError(connection);
+
+ // if lastApplError.error != 0 this indicates a CommandTermination-
+ if (lastApplError.error != 0) {
+ printf("Received CommandTermination-.\n");
+ printf(" LastApplError: %i\n", lastApplError.error);
+ printf(" addCause: %i\n", lastApplError.addCause);
+ }
+ else
+ printf("Received CommandTermination+.\n");
+}
+
+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) {
+
+
+ /************************
+ * Direct control
+ ***********************/
+
+ ControlObjectClient control
+ = ControlObjectClient_create("simpleIOGenericIO/GGIO1.SPCSO1", con);
+
+ MmsValue* ctlVal = MmsValue_newBoolean(true);
+
+ if (ControlObjectClient_operate(control, ctlVal, 0 /* operate now */)) {
+ printf("simpleIOGenericIO/GGIO1.SPCSO1 operated successfully\n");
+ }
+ else {
+ printf("failed to operate simpleIOGenericIO/GGIO1.SPCSO1\n");
+ }
+
+ MmsValue_delete(ctlVal);
+
+ ControlObjectClient_destroy(control);
+
+ /* Check if status value has changed */
+
+ MmsValue* stVal = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.SPCSO1.stVal", IEC61850_FC_ST);
+
+ if (error == IED_ERROR_OK) {
+ bool state = MmsValue_getBoolean(stVal);
+ MmsValue_delete(stVal);
+
+ printf("New status of simpleIOGenericIO/GGIO1.SPCSO1.stVal: %i\n", state);
+ }
+ else {
+ printf("Reading status for simpleIOGenericIO/GGIO1.SPCSO1 failed!\n");
+ }
+
+
+ /************************
+ * Select before operate
+ ***********************/
+
+ control = ControlObjectClient_create("simpleIOGenericIO/GGIO1.SPCSO2", con);
+
+ if (ControlObjectClient_select(control)) {
+
+ ctlVal = MmsValue_newBoolean(true);
+
+ if (ControlObjectClient_operate(control, ctlVal, 0 /* operate now */)) {
+ printf("simpleIOGenericIO/GGIO1.SPCSO2 operated successfully\n");
+ }
+ else {
+ printf("failed to operate simpleIOGenericIO/GGIO1.SPCSO2!\n");
+ }
+
+ MmsValue_delete(ctlVal);
+ }
+ else {
+ printf("failed to select simpleIOGenericIO/GGIO1.SPCSO2!\n");
+ }
+
+ ControlObjectClient_destroy(control);
+
+
+ /****************************************
+ * Direct control with enhanced security
+ ****************************************/
+
+ control = ControlObjectClient_create("simpleIOGenericIO/GGIO1.SPCSO3", con);
+
+ ControlObjectClient_setCommandTerminationHandler(control, commandTerminationHandler, NULL);
+
+ ctlVal = MmsValue_newBoolean(true);
+
+ if (ControlObjectClient_operate(control, ctlVal, 0 /* operate now */)) {
+ printf("simpleIOGenericIO/GGIO1.SPCSO3 operated successfully\n");
+ }
+ else {
+ printf("failed to operate simpleIOGenericIO/GGIO1.SPCSO3\n");
+ }
+
+ MmsValue_delete(ctlVal);
+
+ /* Wait for command termination message */
+ Thread_sleep(1000);
+
+ ControlObjectClient_destroy(control);
+
+ /* Check if status value has changed */
+
+ stVal = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.SPCSO3.stVal", IEC61850_FC_ST);
+
+ if (error == IED_ERROR_OK) {
+ bool state = MmsValue_getBoolean(stVal);
+
+ printf("New status of simpleIOGenericIO/GGIO1.SPCSO3.stVal: %i\n", state);
+
+ MmsValue_delete(stVal);
+ }
+ else {
+ printf("Reading status for simpleIOGenericIO/GGIO1.SPCSO3 failed!\n");
+ }
+
+ /***********************************************
+ * Select before operate with enhanced security
+ ***********************************************/
+
+ control = ControlObjectClient_create("simpleIOGenericIO/GGIO1.SPCSO4", con);
+
+ ControlObjectClient_setCommandTerminationHandler(control, commandTerminationHandler, NULL);
+
+ ctlVal = MmsValue_newBoolean(true);
+
+ if (ControlObjectClient_selectWithValue(control, ctlVal)) {
+
+ if (ControlObjectClient_operate(control, ctlVal, 0 /* operate now */)) {
+ printf("simpleIOGenericIO/GGIO1.SPCSO4 operated successfully\n");
+ }
+ else {
+ printf("failed to operate simpleIOGenericIO/GGIO1.SPCSO4!\n");
+ }
+
+ }
+ else {
+ printf("failed to select simpleIOGenericIO/GGIO1.SPCSO4!\n");
+ }
+
+ MmsValue_delete(ctlVal);
+
+ /* Wait for command termination message */
+ Thread_sleep(1000);
+
+ ControlObjectClient_destroy(control);
+
+
+ /*********************************************************************
+ * Direct control with enhanced security (expect CommandTermination-)
+ *********************************************************************/
+
+ control = ControlObjectClient_create("simpleIOGenericIO/GGIO1.SPCSO9", con);
+
+ ControlObjectClient_setCommandTerminationHandler(control, commandTerminationHandler, NULL);
+
+ ctlVal = MmsValue_newBoolean(true);
+
+ if (ControlObjectClient_operate(control, ctlVal, 0 /* operate now */)) {
+ printf("simpleIOGenericIO/GGIO1.SPCSO9 operated successfully\n");
+ }
+ else {
+ printf("failed to operate simpleIOGenericIO/GGIO1.SPCSO9\n");
+ }
+
+ MmsValue_delete(ctlVal);
+
+ /* Wait for command termination message */
+ Thread_sleep(1000);
+
+ ControlObjectClient_destroy(control);
+
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Connection failed!\n");
+ }
+
+ IedConnection_destroy(con);
+}
+
+
diff --git a/examples/iec61850_client_example4/CMakeLists.txt b/examples/iec61850_client_example4/CMakeLists.txt
new file mode 100644
index 0000000..2c14b05
--- /dev/null
+++ b/examples/iec61850_client_example4/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example4_SRCS
+ client_example4.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example4_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example4
+ ${iec61850_client_example4_SRCS}
+)
+
+target_link_libraries(iec61850_client_example4
+ iec61850
+)
diff --git a/examples/iec61850_client_example4/Makefile b/examples/iec61850_client_example4/Makefile
new file mode 100644
index 0000000..9e62f3b
--- /dev/null
+++ b/examples/iec61850_client_example4/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example4
+PROJECT_SOURCES = 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/iec61850_client_example4/client_example4.c b/examples/iec61850_client_example4/client_example4.c
new file mode 100644
index 0000000..1b1d461
--- /dev/null
+++ b/examples/iec61850_client_example4/client_example4.c
@@ -0,0 +1,92 @@
+/*
+ * client_example4.c
+ *
+ * How to create and delete data sets at a remote server.
+ *
+ * This example is intended to be used with server_example3 or server_example_goose.
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+
+#include "hal_thread.h"
+
+static void
+printDataSetValues(MmsValue* dataSet)
+{
+ int i;
+ for (i = 0; i < 4; i++) {
+ printf(" GGIO1.AnIn%i.mag.f: %f\n", i,
+ MmsValue_toFloat(MmsValue_getElement(MmsValue_getElement(
+ MmsValue_getElement(dataSet, i), 0), 0)));
+ }
+}
+
+void
+reportCallbackFunction(void* parameter, ClientReport report)
+{
+ MmsValue* dataSetValues = (MmsValue*) parameter;
+
+ printf("received report\n");
+
+ printDataSetValues(dataSetValues);
+}
+
+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) {
+
+ /* Create a new data set at the remote server */
+ LinkedList newDataSetEntries = LinkedList_create();
+
+ LinkedList_add(newDataSetEntries, "simpleIOGenericIO/GGIO1.AnIn1[MX]");
+ LinkedList_add(newDataSetEntries, "simpleIOGenericIO/GGIO1.AnIn2[MX]");
+ LinkedList_add(newDataSetEntries, "simpleIOGenericIO/GGIO1.AnIn3[MX]");
+ LinkedList_add(newDataSetEntries, "simpleIOGenericIO/GGIO1.AnIn4[MX]");
+
+ IedConnection_createDataSet(con, &error, "simpleIOGenericIO/LLN0.AnalogueValues", newDataSetEntries);
+
+ LinkedList_destroyStatic(newDataSetEntries);
+
+ printf("error: %i\n", error);
+
+ /* read data set */
+ ClientDataSet clientDataSet;
+
+ clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.AnalogueValues", NULL);
+
+ printDataSetValues(ClientDataSet_getValues(clientDataSet));
+
+ Thread_sleep(1000);
+
+ IedConnection_deleteDataSet(con, &error, "simpleIOGenericIO/LLN0.AnalogueValues");
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Failed to connect to %s:%i\n", hostname, tcpPort);
+ }
+
+ IedConnection_destroy(con);
+}
+
+
diff --git a/examples/iec61850_client_example5/CMakeLists.txt b/examples/iec61850_client_example5/CMakeLists.txt
new file mode 100644
index 0000000..9c18a24
--- /dev/null
+++ b/examples/iec61850_client_example5/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example5_SRCS
+ client_example5.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example5_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example5
+ ${iec61850_client_example5_SRCS}
+)
+
+target_link_libraries(iec61850_client_example5
+ iec61850
+)
diff --git a/examples/iec61850_client_example5/Makefile b/examples/iec61850_client_example5/Makefile
new file mode 100644
index 0000000..8a1449b
--- /dev/null
+++ b/examples/iec61850_client_example5/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example5
+PROJECT_SOURCES = 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/iec61850_client_example5/client_example5.c b/examples/iec61850_client_example5/client_example5.c
new file mode 100644
index 0000000..f49c0ab
--- /dev/null
+++ b/examples/iec61850_client_example5/client_example5.c
@@ -0,0 +1,85 @@
+/*
+ * client_example5.c
+ *
+ * - How to change connection parameters of the lower layers of MMS
+ * - How to use password authentication
+ *
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+
+#include "hal_thread.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]);
+
+ IedClientError error;
+
+ IedConnection con = IedConnection_create();
+
+ /* To change MMS parameters you need to get access to the underlying MmsConnection */
+ MmsConnection mmsConnection = IedConnection_getMmsConnection(con);
+
+ /* Get the container for the parameters */
+ IsoConnectionParameters parameters = MmsConnection_getIsoConnectionParameters(mmsConnection);
+
+ /* set remote AP-Title according to SCL file example from IEC 61850-8-1 */
+ IsoConnectionParameters_setRemoteApTitle(parameters, "1.3.9999.13", 12);
+
+ /* just some arbitrary numbers */
+ IsoConnectionParameters_setLocalApTitle(parameters, "1.2.1200.15.3", 1);
+
+ /* use this to skip AP-Title completely - this may be required by some "obscure" servers */
+// IsoConnectionParameters_setRemoteApTitle(parameters, NULL, 0);
+// IsoConnectionParameters_setLocalApTitle(parameters, NULL, 0);
+
+ TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } };
+ TSelector remoteTSelector = { 2, { 0x00, 0x01 } };
+
+ /* change parameters for presentation, session and transport layers */
+ IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, 12, localTSelector);
+ IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, 1234 , remoteTSelector);
+
+ char* password = "top secret";
+
+ /* 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_setAcseAuthenticationParameter(parameters, auth);
+
+ IedConnection_setConnectTimeout(con, 10000);
+
+ /* call connect when all parameters are set */
+ IedConnection_connect(con, &error, hostname, tcpPort);
+
+ if (error == IED_ERROR_OK) {
+
+ Thread_sleep(1000);
+
+ 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/CMakeLists.txt b/examples/iec61850_client_example_files/CMakeLists.txt
new file mode 100644
index 0000000..10b7ab0
--- /dev/null
+++ b/examples/iec61850_client_example_files/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example_files_SRCS
+ client_example_files.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example_files_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example_files
+ ${iec61850_client_example_files_SRCS}
+)
+
+target_link_libraries(iec61850_client_example_files
+ iec61850
+)
diff --git a/examples/iec61850_client_example_files/Makefile b/examples/iec61850_client_example_files/Makefile
new file mode 100644
index 0000000..eea5d9f
--- /dev/null
+++ b/examples/iec61850_client_example_files/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example_files
+PROJECT_SOURCES = client_example_files.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/iec61850_client_example_files/client_example_files.c b/examples/iec61850_client_example_files/client_example_files.c
new file mode 100644
index 0000000..33c6750
--- /dev/null
+++ b/examples/iec61850_client_example_files/client_example_files.c
@@ -0,0 +1,104 @@
+/*
+ * 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);
+ 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_reporting/CMakeLists.txt b/examples/iec61850_client_example_reporting/CMakeLists.txt
new file mode 100644
index 0000000..621f129
--- /dev/null
+++ b/examples/iec61850_client_example_reporting/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(iec61850_client_example_reporting_SRCS
+ client_example_reporting.c
+)
+
+IF(WIN32)
+set_source_files_properties(${iec61850_client_example_reporting_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(iec61850_client_example_reporting
+ ${iec61850_client_example_reporting_SRCS}
+)
+
+target_link_libraries(iec61850_client_example_reporting
+ iec61850
+)
diff --git a/examples/iec61850_client_example_reporting/Makefile b/examples/iec61850_client_example_reporting/Makefile
new file mode 100644
index 0000000..44d9bc1
--- /dev/null
+++ b/examples/iec61850_client_example_reporting/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = client_example_reporting
+PROJECT_SOURCES = client_example_reporting.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/iec61850_client_example_reporting/client_example_reporting.c b/examples/iec61850_client_example_reporting/client_example_reporting.c
new file mode 100644
index 0000000..ba119f0
--- /dev/null
+++ b/examples/iec61850_client_example_reporting/client_example_reporting.c
@@ -0,0 +1,168 @@
+/*
+ * client_example_reporting.c
+ *
+ * This example is intended to be used with server_example3 or server_example_goose.
+ */
+
+#include "iec61850_client.h"
+
+#include
+#include
+#include
+#include
+
+#include "hal_thread.h"
+
+static int running = 0;
+
+void sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+
+void
+reportCallbackFunction(void* parameter, ClientReport report)
+{
+ LinkedList dataSetDirectory = (LinkedList) parameter;
+
+ MmsValue* dataSetValues = ClientReport_getDataSetValues(report);
+
+ printf("received report for %s with rptId %s\n", ClientReport_getRcbReference(report), ClientReport_getRptId(report));
+
+ if (ClientReport_hasTimestamp(report)) {
+ time_t unixTime = ClientReport_getTimestamp(report) / 1000;
+
+#ifdef WIN32
+ char* timeBuf = ctime(&unixTime);
+#else
+ char timeBuf[30];
+ ctime_r(&unixTime, timeBuf);
+#endif
+
+ printf(" report contains timestamp (%u):", (unsigned int) unixTime);
+ printf("%s \n", timeBuf);
+ }
+
+ int i;
+ for (i = 0; i < LinkedList_size(dataSetDirectory); i++) {
+ ReasonForInclusion reason = ClientReport_getReasonForInclusion(report, i);
+
+ if (reason != REASON_NOT_INCLUDED) {
+
+ LinkedList entry = LinkedList_get(dataSetDirectory, i);
+
+ char* entryName = (char*) entry->data;
+
+ printf(" %s (included for reason %i)\n", entryName, reason);
+ }
+ }
+}
+
+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]);
+
+ running = 1;
+
+ signal(SIGINT, sigint_handler);
+
+ IedClientError error;
+
+ IedConnection con = IedConnection_create();
+
+ IedConnection_connect(con, &error, hostname, tcpPort);
+
+ if (error == IED_ERROR_OK) {
+
+ /* read data set directory */
+ LinkedList dataSetDirectory =
+ IedConnection_getDataSetDirectory(con, &error, "simpleIOGenericIO/LLN0.Events", NULL);
+
+ if (error != IED_ERROR_OK) {
+ printf("Reading data set directory failed!\n");
+ goto exit_error;
+ }
+
+ /* read data set */
+ ClientDataSet clientDataSet;
+
+ clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL);
+
+ if (clientDataSet == NULL) {
+ printf("failed to read dataset\n");
+ goto exit_error;
+ }
+
+ /* Read RCB values */
+ ClientReportControlBlock rcb =
+ IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL);
+
+ if (error != IED_ERROR_OK) {
+ printf("getRCBValues service error!\n");
+ goto exit_error;
+ }
+
+ /* prepare the parameters of the RCP */
+ ClientReportControlBlock_setResv(rcb, true);
+ ClientReportControlBlock_setDataSetReference(rcb, "simpleIOGenericIO/LLN0$Events"); /* NOTE the "$" instead of "." ! */
+ ClientReportControlBlock_setRptEna(rcb, true);
+
+ /* Configure the report receiver */
+ IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB", ClientReportControlBlock_getRptId(rcb), reportCallbackFunction,
+ (void*) dataSetDirectory);
+
+ /* Write RCB parameters and enable report */
+ IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RESV | RCB_ELEMENT_DATSET | RCB_ELEMENT_RPT_ENA, true);
+
+ if (error != IED_ERROR_OK) {
+ printf("setRCBValues service error!\n");
+ goto exit_error;
+ }
+
+ Thread_sleep(1000);
+
+ IedConnection_triggerGIReport(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01");
+
+ if (error != IED_ERROR_OK) {
+ printf("Error triggering a GI report (code: %i)\n", error);
+ }
+
+ while (running) {
+ Thread_sleep(10);
+
+ IedConnectionState conState = IedConnection_getState(con);
+
+ if (conState != IED_STATE_CONNECTED) {
+ printf("Connection closed by server!\n");
+ running = 0;
+ }
+ }
+
+ exit_error:
+
+ /* disable reporting */
+ ClientReportControlBlock_setRptEna(rcb, false);
+ IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true);
+
+ ClientDataSet_destroy(clientDataSet);
+
+ IedConnection_close(con);
+ }
+ else {
+ printf("Failed to connect to %s:%i\n", hostname, tcpPort);
+ }
+
+ IedConnection_destroy(con);
+}
+
+
diff --git a/examples/mms_client_example1/CMakeLists.txt b/examples/mms_client_example1/CMakeLists.txt
new file mode 100644
index 0000000..5f5a027
--- /dev/null
+++ b/examples/mms_client_example1/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+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
new file mode 100644
index 0000000..0e1aeff
--- /dev/null
+++ b/examples/mms_client_example1/Makefile
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..d8ad47c
--- /dev/null
+++ b/examples/mms_client_example1/mms_client_example1.c
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000..b56f7a5
--- /dev/null
+++ b/examples/mms_client_example2/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(mms_client_example2_SRCS
+ mms_client_example2.c
+)
+
+IF(WIN32)
+set_source_files_properties(${mms_client_example2_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+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
new file mode 100644
index 0000000..47f3467
--- /dev/null
+++ b/examples/mms_client_example2/Makefile
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..908cb91
--- /dev/null
+++ b/examples/mms_client_example2/mms_client_example2.c
@@ -0,0 +1,64 @@
+
+#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
new file mode 100644
index 0000000..4a5cab0
--- /dev/null
+++ b/examples/mms_client_example3/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(mms_client_example3_SRCS
+ mms_client_example3.c
+)
+
+IF(WIN32)
+set_source_files_properties(${mms_client_example3_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+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
new file mode 100644
index 0000000..eb6fa6c
--- /dev/null
+++ b/examples/mms_client_example3/Makefile
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..eb04c1c
--- /dev/null
+++ b/examples/mms_client_example3/mms_client_example3.c
@@ -0,0 +1,41 @@
+
+#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
new file mode 100644
index 0000000..6335c59
--- /dev/null
+++ b/examples/mms_client_example4/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(mms_client_example4_SRCS
+ mms_client_example4.c
+)
+
+IF(WIN32)
+set_source_files_properties(${mms_client_example4_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+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
new file mode 100644
index 0000000..30451ce
--- /dev/null
+++ b/examples/mms_client_example4/Makefile
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..13a8d22
--- /dev/null
+++ b/examples/mms_client_example4/mms_client_example4.c
@@ -0,0 +1,87 @@
+/*
+ * 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
new file mode 100644
index 0000000..fdc6f0a
--- /dev/null
+++ b/examples/mms_client_example5/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+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
new file mode 100644
index 0000000..72d220c
--- /dev/null
+++ b/examples/mms_client_example5/Makefile
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..ae05040
--- /dev/null
+++ b/examples/mms_client_example5/mms_client_example5.c
@@ -0,0 +1,50 @@
+
+#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/mms_utility/CMakeLists.txt b/examples/mms_utility/CMakeLists.txt
new file mode 100644
index 0000000..ddc157e
--- /dev/null
+++ b/examples/mms_utility/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+set(mms_utility_SRCS
+ mms_utility.c
+)
+
+IF(WIN32)
+set_source_files_properties(${mms_utility_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(mms_utility
+ ${mms_utility_SRCS}
+)
+
+target_link_libraries(mms_utility
+ iec61850
+)
diff --git a/examples/mms_utility/Makefile b/examples/mms_utility/Makefile
new file mode 100644
index 0000000..0adeacc
--- /dev/null
+++ b/examples/mms_utility/Makefile
@@ -0,0 +1,17 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = mms_utility
+PROJECT_SOURCES = mms_utility.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_utility/mms_utility.c b/examples/mms_utility/mms_utility.c
new file mode 100644
index 0000000..b59d333
--- /dev/null
+++ b/examples/mms_utility/mms_utility.c
@@ -0,0 +1,115 @@
+
+#include
+#include
+#include
+#include "string_utilities.h"
+#include "mms_client_connection.h"
+
+static void
+print_help()
+{
+ printf("MMS utility (libiec61850 v0.5) options:\n");
+ printf("-h specify hostname\n");
+ printf("-p specify port\n");
+ printf("-l specify maximum PDU size\n");
+ printf("-d show list of MMS domains\n");
+ printf("-i show server identity\n");
+ printf("-t show domain directory\n");
+}
+
+int main(int argc, char** argv) {
+
+ char* hostname = copyString("localhost");
+ int tcpPort = 102;
+ int maxPduSize = 65000;
+
+ char* domainName = NULL;
+
+ int readDeviceList = 0;
+ int getDeviceDirectory = 0;
+ int identifyDevice = 0;
+
+ int c;
+
+ while ((c = getopt(argc, argv, "idh:p:l:t:")) != -1)
+ switch (c) {
+ case 'h':
+ hostname = copyString(optarg);
+ break;
+ case 'p':
+ tcpPort = atoi(optarg);
+ break;
+ case 'l':
+ maxPduSize = atoi(optarg);
+ break;
+ case 'd':
+ readDeviceList = 1;
+ break;
+ case 'i':
+ identifyDevice = 1;
+ break;
+ case 't':
+ getDeviceDirectory = 1;
+ domainName = copyString(optarg);
+ break;
+ default:
+ print_help();
+ return 0;
+ }
+
+ MmsConnection con = MmsConnection_create();
+
+ MmsError error;
+
+ /* Set maximum MMS PDU size (local detail) to 2000 byte */
+ MmsConnection_setLocalDetail(con, maxPduSize);
+
+ if (!MmsConnection_connect(con, &error, hostname, tcpPort)) {
+ printf("MMS connect failed!\n");
+ goto exit;
+ }
+ else
+ printf("MMS connected.\n");
+
+ if (identifyDevice) {
+ MmsServerIdentity* identity =
+ MmsConnection_identify(con, &error);
+
+ if (identity != NULL) {
+ printf("\nServer identity:\n----------------\n");
+ printf(" vendor:\t%s\n", identity->vendorName);
+ printf(" model:\t%s\n", identity->modelName);
+ printf(" revision:\t%s\n", identity->revision);
+ }
+ else
+ printf("Reading server identity failed!\n");
+ }
+
+ if (readDeviceList) {
+ printf("\nDomains present on server:\n--------------------------\n");
+ LinkedList nameList = MmsConnection_getDomainNames(con, &error);
+ LinkedList_printStringList(nameList);
+ LinkedList_destroy(nameList);
+ }
+
+ if (getDeviceDirectory) {
+ LinkedList variableList = MmsConnection_getDomainVariableNames(con, &error,
+ domainName);
+
+ LinkedList element = variableList;
+
+ printf("\nMMS domain variables for domain %s\n", domainName);
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ char* name = (char*) element->data;
+
+ if (strchr(name, '$') == NULL)
+ printf(" %s\n", name);
+ }
+
+ }
+
+exit:
+ MmsConnection_destroy(con);
+}
+
diff --git a/examples/server_example1/CMakeLists.txt b/examples/server_example1/CMakeLists.txt
new file mode 100644
index 0000000..3521090
--- /dev/null
+++ b/examples/server_example1/CMakeLists.txt
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..0643046
--- /dev/null
+++ b/examples/server_example1/Makefile
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..9b2c0fc
--- /dev/null
+++ b/examples/server_example1/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_example1/server_example1.c b/examples/server_example1/server_example1.c
new file mode 100644
index 0000000..14a0b2a
--- /dev/null
+++ b/examples/server_example1/server_example1.c
@@ -0,0 +1,78 @@
+/*
+ * 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);
+
+ // get stored values from persistent storage
+
+ // 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
new file mode 100644
index 0000000..88e51ab
--- /dev/null
+++ b/examples/server_example1/static_model.c
@@ -0,0 +1,1754 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from sampleModel_with_dataset.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+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;
+
+extern DataSet ds_Device1_LLN0_dataset1;
+
+
+extern DataSetEntry ds_Device1_LLN0_dataset1_fcda0;
+extern DataSetEntry ds_Device1_LLN0_dataset1_fcda1;
+extern DataSetEntry ds_Device1_LLN0_dataset1_fcda2;
+
+DataSetEntry ds_Device1_LLN0_dataset1_fcda0 = {
+ "Device1",
+ false,
+ "LLN0$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Device1_LLN0_dataset1_fcda1
+};
+
+DataSetEntry ds_Device1_LLN0_dataset1_fcda1 = {
+ "Device1",
+ false,
+ "MMXU1$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Device1_LLN0_dataset1_fcda2
+};
+
+DataSetEntry ds_Device1_LLN0_dataset1_fcda2 = {
+ "Device1",
+ false,
+ "MMXU1$CF$Mod$ctlModel",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_Device1_LLN0_dataset1 = {
+ "Device1",
+ "LLN0$dataset1",
+ 3,
+ &ds_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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Device1_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Device1_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Device1_DGEN1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Device1_DSCH1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Device1_MMXU1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Device1_MMXU2_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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, 9, 239, 50, 900000, NULL};
+
+
+
+
+IedModel iedModel = {
+ "SampleIED",
+ &iedModel_Device1,
+ &ds_Device1_LLN0_dataset1,
+ &iedModel_Device1_LLN0_report0,
+ 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
new file mode 100644
index 0000000..208787e
--- /dev/null
+++ b/examples/server_example1/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_example2/CMakeLists.txt b/examples/server_example2/CMakeLists.txt
new file mode 100644
index 0000000..994caae
--- /dev/null
+++ b/examples/server_example2/CMakeLists.txt
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..3781758
--- /dev/null
+++ b/examples/server_example2/Makefile
@@ -0,0 +1,24 @@
+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
new file mode 100644
index 0000000..9d5ccea
--- /dev/null
+++ b/examples/server_example2/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_example2/server_example2.c b/examples/server_example2/server_example2.c
new file mode 100644
index 0000000..6d7f351
--- /dev/null
+++ b/examples/server_example2/server_example2.c
@@ -0,0 +1,91 @@
+/*
+ * 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
new file mode 100644
index 0000000..fdc336c
--- /dev/null
+++ b/examples/server_example2/static_model.c
@@ -0,0 +1,3912 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from complexModel.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+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;
+
+extern DataSet ds_Inverter_LLN0_dataset1;
+
+
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda0;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda1;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda2;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda3;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda4;
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda0 = {
+ "Inverter",
+ false,
+ "LLN0$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda1
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda1 = {
+ "Battery",
+ false,
+ "LLN0$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda2
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda2 = {
+ "Inverter",
+ false,
+ "MMXU1$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda3
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda3 = {
+ "Inverter",
+ false,
+ "MMXU1$CF$Mod$ctlModel",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda4
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = {
+ "Inverter",
+ false,
+ "MMXU1$MX$TotW$mag",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_Inverter_LLN0_dataset1 = {
+ "Inverter",
+ "LLN0$dataset1",
+ 5,
+ &ds_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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_ZINV1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_MMXU1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_ZBAT1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_ZBTC1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+extern ReportControlBlock iedModel_Inverter_LLN0_report0;
+
+ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 3, 32, 0, 0, NULL};
+
+
+
+
+IedModel iedModel = {
+ "ied1",
+ &iedModel_Inverter,
+ &ds_Inverter_LLN0_dataset1,
+ &iedModel_Inverter_LLN0_report0,
+ 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
new file mode 100644
index 0000000..34623f8
--- /dev/null
+++ b/examples/server_example2/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_ */
+
diff --git a/examples/server_example3/CMakeLists.txt b/examples/server_example3/CMakeLists.txt
new file mode 100644
index 0000000..e3dbe43
--- /dev/null
+++ b/examples/server_example3/CMakeLists.txt
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..65e2509
--- /dev/null
+++ b/examples/server_example3/Makefile
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 0000000..2352bc6
--- /dev/null
+++ b/examples/server_example3/server_example3.c
@@ -0,0 +1,167 @@
+/*
+ * 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);
+
+ /* 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
new file mode 100644
index 0000000..df5636b
--- /dev/null
+++ b/examples/server_example3/simpleIO_direct_control.icd
@@ -0,0 +1,273 @@
+
+
+
+
+
+ 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
new file mode 100644
index 0000000..5f65ff6
--- /dev/null
+++ b/examples/server_example3/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_example3/static_model.c b/examples/server_example3/static_model.c
new file mode 100644
index 0000000..9208a9f
--- /dev/null
+++ b/examples/server_example3/static_model.c
@@ -0,0 +1,1989 @@
+/*
+ * 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1};
+ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2};
+ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3};
+ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4};
+ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report5};
+ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, &iedModel_GenericIO_LLN0_report6};
+ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 0, 111, 50, 1000, NULL};
+
+
+
+
+IedModel iedModel = {
+ "simpleIO",
+ &iedModel_GenericIO,
+ &iedModelds_GenericIO_LLN0_Events,
+ &iedModel_GenericIO_LLN0_report0,
+ NULL,
+ NULL,
+ 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
new file mode 100644
index 0000000..b5670e9
--- /dev/null
+++ b/examples/server_example3/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_example3/vmd-filestore/SYSTEM.BIN b/examples/server_example3/vmd-filestore/SYSTEM.BIN
new file mode 100644
index 0000000..e69de29
diff --git a/examples/server_example4/CMakeLists.txt b/examples/server_example4/CMakeLists.txt
new file mode 100644
index 0000000..d738b0f
--- /dev/null
+++ b/examples/server_example4/CMakeLists.txt
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..4907673
--- /dev/null
+++ b/examples/server_example4/Makefile
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..b3aa07f
--- /dev/null
+++ b/examples/server_example4/server_example4.c
@@ -0,0 +1,157 @@
+/*
+ * 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
new file mode 100644
index 0000000..3081dff
--- /dev/null
+++ b/examples/server_example4/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_example4/static_model.c b/examples/server_example4/static_model.c
new file mode 100644
index 0000000..c391fde
--- /dev/null
+++ b/examples/server_example4/static_model.c
@@ -0,0 +1,1948 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from simpleIO_direct_control.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_GenericIO;
+extern LogicalNode iedModel_GenericIO_LLN0;
+extern DataObject iedModel_GenericIO_LLN0_Mod;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_t;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_LLN0_Beh;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_t;
+extern DataObject iedModel_GenericIO_LLN0_Health;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_t;
+extern DataObject iedModel_GenericIO_LLN0_NamPlt;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_GenericIO_LPHD1;
+extern DataObject iedModel_GenericIO_LPHD1_PhyNam;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor;
+extern DataObject iedModel_GenericIO_LPHD1_PhyHealth;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t;
+extern DataObject iedModel_GenericIO_LPHD1_Proxy;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t;
+extern LogicalNode iedModel_GenericIO_GGIO1;
+extern DataObject iedModel_GenericIO_GGIO1_Mod;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_Beh;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t;
+extern DataObject iedModel_GenericIO_GGIO1_Health;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_t;
+extern DataObject iedModel_GenericIO_GGIO1_NamPlt;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn1;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn2;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn3;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn4;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO1;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind1;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind2;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind3;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind4;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
+
+extern DataSet ds_GenericIO_LLN0_Events;
+
+
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3;
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO1$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda1
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO2$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda2
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO3$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda3
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO4$stVal",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_GenericIO_LLN0_Events = {
+ "GenericIO",
+ "LLN0$Events",
+ 4,
+ &ds_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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
+
+ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 8, 111, 50, 1000, NULL};
+
+
+
+
+IedModel iedModel = {
+ "simpleIO",
+ &iedModel_GenericIO,
+ &ds_GenericIO_LLN0_Events,
+ &iedModel_GenericIO_LLN0_report0,
+ 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
new file mode 100644
index 0000000..58dd28b
--- /dev/null
+++ b/examples/server_example4/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_example5/CMakeLists.txt b/examples/server_example5/CMakeLists.txt
new file mode 100644
index 0000000..8ca7c4c
--- /dev/null
+++ b/examples/server_example5/CMakeLists.txt
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..4a2c419
--- /dev/null
+++ b/examples/server_example5/Makefile
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..9d5ccea
--- /dev/null
+++ b/examples/server_example5/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_example5/server_example5.c b/examples/server_example5/server_example5.c
new file mode 100644
index 0000000..1d6d90e
--- /dev/null
+++ b/examples/server_example5/server_example5.c
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000..fdc336c
--- /dev/null
+++ b/examples/server_example5/static_model.c
@@ -0,0 +1,3912 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from complexModel.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+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;
+
+extern DataSet ds_Inverter_LLN0_dataset1;
+
+
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda0;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda1;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda2;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda3;
+extern DataSetEntry ds_Inverter_LLN0_dataset1_fcda4;
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda0 = {
+ "Inverter",
+ false,
+ "LLN0$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda1
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda1 = {
+ "Battery",
+ false,
+ "LLN0$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda2
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda2 = {
+ "Inverter",
+ false,
+ "MMXU1$ST$Mod$q",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda3
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda3 = {
+ "Inverter",
+ false,
+ "MMXU1$CF$Mod$ctlModel",
+ -1,
+ NULL,
+ NULL,
+ &ds_Inverter_LLN0_dataset1_fcda4
+};
+
+DataSetEntry ds_Inverter_LLN0_dataset1_fcda4 = {
+ "Inverter",
+ false,
+ "MMXU1$MX$TotW$mag",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_Inverter_LLN0_dataset1 = {
+ "Inverter",
+ "LLN0$dataset1",
+ 5,
+ &ds_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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_ZINV1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Inverter_MMXU1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_ZBAT1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_Battery_ZBTC1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+extern ReportControlBlock iedModel_Inverter_LLN0_report0;
+
+ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 3, 32, 0, 0, NULL};
+
+
+
+
+IedModel iedModel = {
+ "ied1",
+ &iedModel_Inverter,
+ &ds_Inverter_LLN0_dataset1,
+ &iedModel_Inverter_LLN0_report0,
+ 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
new file mode 100644
index 0000000..34623f8
--- /dev/null
+++ b/examples/server_example5/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_ */
+
diff --git a/examples/server_example_61400_25/CMakeLists.txt b/examples/server_example_61400_25/CMakeLists.txt
new file mode 100644
index 0000000..1f90cc8
--- /dev/null
+++ b/examples/server_example_61400_25/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(server_example_61400_25_SRCS
+ server_example_61400_25.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_61400_25_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_61400_25
+ ${server_example_61400_25_SRCS}
+)
+
+target_link_libraries(server_example_61400_25
+ iec61850
+)
diff --git a/examples/server_example_61400_25/Makefile b/examples/server_example_61400_25/Makefile
new file mode 100644
index 0000000..28ab208
--- /dev/null
+++ b/examples/server_example_61400_25/Makefile
@@ -0,0 +1,25 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_61400_25
+PROJECT_SOURCES = server_example_61400_25.c
+PROJECT_SOURCES += static_model.c
+
+PROJECT_ICD_FILE = wtur.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_61400_25/server_example_61400_25.c b/examples/server_example_61400_25/server_example_61400_25.c
new file mode 100644
index 0000000..c066411
--- /dev/null
+++ b/examples/server_example_61400_25/server_example_61400_25.c
@@ -0,0 +1,102 @@
+/*
+ * 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 IedServer iedServer;
+
+static int running = 0;
+
+void sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+
+bool
+controlHandlerForIntegerOutput(void* parameter, MmsValue* value, bool test)
+{
+ if (MmsValue_getType(value) != MMS_INTEGER)
+ return false;
+
+ printf("Received integer control value: %i\n", MmsValue_toInt32(value));
+
+ uint64_t timeStamp = Hal_getTimeInMs();
+
+ if (parameter == IEDMODEL_WTG_WTUR1_SetTurOp_actSt) {
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_t, timeStamp);
+ IedServer_updateAttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_stVal, value);
+ }
+
+ return true;
+}
+
+int main(int argc, char** argv) {
+
+ int tcpPort = 102;
+
+ if (argc > 1) {
+ tcpPort = atoi(argv[1]);
+ }
+
+ iedServer = IedServer_create(&iedModel);
+
+ /* set control model for WTUR1.SetTurOp.actSt to direct-control-with-normal-security */
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt_ctlModel, 1);
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_WTG_WTUR1_SetTurOp_actSt,
+ (ControlHandler) controlHandlerForIntegerOutput,
+ IEDMODEL_WTG_WTUR1_SetTurOp_actSt);
+
+ /* 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_61400_25/static_model.c b/examples/server_example_61400_25/static_model.c
new file mode 100644
index 0000000..ba022fd
--- /dev/null
+++ b/examples/server_example_61400_25/static_model.c
@@ -0,0 +1,4482 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from wtur.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_WTG;
+extern LogicalNode iedModel_WTG_LLN0;
+extern DataObject iedModel_WTG_LLN0_Mod;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_operTm;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_T;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Test;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Check;
+extern DataAttribute iedModel_WTG_LLN0_Mod_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Mod_q;
+extern DataAttribute iedModel_WTG_LLN0_Mod_t;
+extern DataAttribute iedModel_WTG_LLN0_Mod_ctlModel;
+extern DataObject iedModel_WTG_LLN0_Beh;
+extern DataAttribute iedModel_WTG_LLN0_Beh_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Beh_q;
+extern DataAttribute iedModel_WTG_LLN0_Beh_t;
+extern DataObject iedModel_WTG_LLN0_Health;
+extern DataAttribute iedModel_WTG_LLN0_Health_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Health_q;
+extern DataAttribute iedModel_WTG_LLN0_Health_t;
+extern DataObject iedModel_WTG_LLN0_NamPlt;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_configRev;
+extern LogicalNode iedModel_WTG_LPHD1;
+extern DataObject iedModel_WTG_LPHD1_NamPlt;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_configRev;
+extern DataObject iedModel_WTG_LPHD1_PhyNam;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_vendor;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_hwRev;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_swRev;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_serNum;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_model;
+extern DataObject iedModel_WTG_LPHD1_PhyHealth;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_t;
+extern DataObject iedModel_WTG_LPHD1_Proxy;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_q;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_t;
+extern LogicalNode iedModel_WTG_WTUR1;
+extern DataObject iedModel_WTG_WTUR1_NamPlt;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_configRev;
+extern DataObject iedModel_WTG_WTUR1_TotWh;
+extern DataObject iedModel_WTG_WTUR1_TotWh_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TotWh_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TotWh_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_TotWh_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_rsPer;
+extern DataObject iedModel_WTG_WTUR1_TurSt;
+extern DataObject iedModel_WTG_WTUR1_TurSt_actSt;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_oldSt;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_actTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tmTot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_rsPer;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_rsPer;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_preTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_pstTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_smpTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_datSetMx;
+extern DataObject iedModel_WTG_WTUR1_W;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag_i;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag_f;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag_i;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag_f;
+extern DataAttribute iedModel_WTG_WTUR1_W_q;
+extern DataAttribute iedModel_WTG_WTUR1_W_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_actSt;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_oldSt;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_dly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_mly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_yly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_dly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_mly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_yly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_tot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs;
+
+
+
+LogicalDevice iedModel_WTG = {
+ LogicalDeviceModelType,
+ "WTG",
+ (ModelNode*) &iedModel,
+ NULL,
+ (ModelNode*) &iedModel_WTG_LLN0
+};
+
+LogicalNode iedModel_WTG_LLN0 = {
+ LogicalNodeModelType,
+ "LLN0",
+ (ModelNode*) &iedModel_WTG,
+ (ModelNode*) &iedModel_WTG_LPHD1,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+};
+
+DataObject iedModel_WTG_LLN0_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_WTG_LLN0,
+ (ModelNode*) &iedModel_WTG_LLN0_Beh,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_stVal,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+ (ModelNode*) &iedModel_WTG_LLN0_Mod_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LLN0_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_WTG_LLN0,
+ (ModelNode*) &iedModel_WTG_LLN0_Health,
+ (ModelNode*) &iedModel_WTG_LLN0_Beh_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_LLN0_Beh_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_LLN0_Beh,
+ (ModelNode*) &iedModel_WTG_LLN0_Beh_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Beh_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_LLN0_Beh,
+ (ModelNode*) &iedModel_WTG_LLN0_Beh_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Beh_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_LLN0_Beh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LLN0_Health = {
+ DataObjectModelType,
+ "Health",
+ (ModelNode*) &iedModel_WTG_LLN0,
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt,
+ (ModelNode*) &iedModel_WTG_LLN0_Health_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_LLN0_Health_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_LLN0_Health,
+ (ModelNode*) &iedModel_WTG_LLN0_Health_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Health_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_LLN0_Health,
+ (ModelNode*) &iedModel_WTG_LLN0_Health_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_Health_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_LLN0_Health,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LLN0_NamPlt = {
+ DataObjectModelType,
+ "NamPlt",
+ (ModelNode*) &iedModel_WTG_LLN0,
+ NULL,
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt_vendor,
+ 0
+};
+
+DataAttribute iedModel_WTG_LLN0_NamPlt_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt,
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_NamPlt_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt,
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt_configRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LLN0_NamPlt_configRev = {
+ DataAttributeModelType,
+ "configRev",
+ (ModelNode*) &iedModel_WTG_LLN0_NamPlt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_WTG_LPHD1 = {
+ LogicalNodeModelType,
+ "LPHD1",
+ (ModelNode*) &iedModel_WTG,
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt,
+};
+
+DataObject iedModel_WTG_LPHD1_NamPlt = {
+ DataObjectModelType,
+ "NamPlt",
+ (ModelNode*) &iedModel_WTG_LPHD1,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt_vendor,
+ 0
+};
+
+DataAttribute iedModel_WTG_LPHD1_NamPlt_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt,
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_NamPlt_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt,
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt_configRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_NamPlt_configRev = {
+ DataAttributeModelType,
+ "configRev",
+ (ModelNode*) &iedModel_WTG_LPHD1_NamPlt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LPHD1_PhyNam = {
+ DataObjectModelType,
+ "PhyNam",
+ (ModelNode*) &iedModel_WTG_LPHD1,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam_vendor,
+ 0
+};
+
+DataAttribute iedModel_WTG_LPHD1_PhyNam_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam_hwRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyNam_hwRev = {
+ DataAttributeModelType,
+ "hwRev",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyNam_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam_serNum,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyNam_serNum = {
+ DataAttributeModelType,
+ "serNum",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam_model,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyNam_model = {
+ DataAttributeModelType,
+ "model",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyNam,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LPHD1_PhyHealth = {
+ DataObjectModelType,
+ "PhyHealth",
+ (ModelNode*) &iedModel_WTG_LPHD1,
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_LPHD1_PhyHealth_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyHealth_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_PhyHealth_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_LPHD1_PhyHealth,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_LPHD1_Proxy = {
+ DataObjectModelType,
+ "Proxy",
+ (ModelNode*) &iedModel_WTG_LPHD1,
+ NULL,
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_LPHD1_Proxy_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy,
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_Proxy_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy,
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_LPHD1_Proxy_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_LPHD1_Proxy,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_WTG_WTUR1 = {
+ LogicalNodeModelType,
+ "WTUR1",
+ (ModelNode*) &iedModel_WTG,
+ NULL,
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt,
+};
+
+DataObject iedModel_WTG_WTUR1_NamPlt = {
+ DataObjectModelType,
+ "NamPlt",
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt_vendor,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_NamPlt_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt,
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_NamPlt_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt,
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt_configRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_NamPlt_configRev = {
+ DataAttributeModelType,
+ "configRev",
+ (ModelNode*) &iedModel_WTG_WTUR1_NamPlt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TotWh = {
+ DataObjectModelType,
+ "TotWh",
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_TotWh_manRs = {
+ DataObjectModelType,
+ "manRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout = {
+ DataAttributeModelType,
+ "sboTimeout",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_manRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TotWh_hisRs = {
+ DataObjectModelType,
+ "hisRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_hisRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TotWh_actCtVal = {
+ DataObjectModelType,
+ "actCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_actCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TotWh_oldCtVal = {
+ DataObjectModelType,
+ "oldCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_ctTot,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_oldCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_ctTot = {
+ DataAttributeModelType,
+ "ctTot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_dly,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_dly = {
+ DataAttributeModelType,
+ "dly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_mly,
+ NULL,
+ 32,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_mly = {
+ DataAttributeModelType,
+ "mly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_yly,
+ NULL,
+ 13,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_yly = {
+ DataAttributeModelType,
+ "yly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_tot,
+ NULL,
+ 21,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_tot = {
+ DataAttributeModelType,
+ "tot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh_rsPer,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TotWh_rsPer = {
+ DataAttributeModelType,
+ "rsPer",
+ (ModelNode*) &iedModel_WTG_WTUR1_TotWh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt = {
+ DataObjectModelType,
+ "TurSt",
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ (ModelNode*) &iedModel_WTG_WTUR1_W,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_TurSt_actSt = {
+ DataObjectModelType,
+ "actSt",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_actSt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_oldSt = {
+ DataObjectModelType,
+ "oldSt",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_oldSt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stTm = {
+ DataObjectModelType,
+ "stTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stTm_manRs = {
+ DataObjectModelType,
+ "manRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout = {
+ DataAttributeModelType,
+ "sboTimeout",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_manRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stTm_hisRs = {
+ DataObjectModelType,
+ "hisRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_hisRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stTm_actTmVal = {
+ DataObjectModelType,
+ "actTmVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_actTmVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal = {
+ DataObjectModelType,
+ "oldTmVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_tmTot,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tmTot = {
+ DataAttributeModelType,
+ "tmTot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_dly,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_dly = {
+ DataAttributeModelType,
+ "dly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_mly,
+ NULL,
+ 32,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_mly = {
+ DataAttributeModelType,
+ "mly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_yly,
+ NULL,
+ 13,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_yly = {
+ DataAttributeModelType,
+ "yly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_tot,
+ NULL,
+ 21,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tot = {
+ DataAttributeModelType,
+ "tot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm_rsPer,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_rsPer = {
+ DataAttributeModelType,
+ "rsPer",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stTm,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stCt = {
+ DataObjectModelType,
+ "stCt",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_preTmms,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stCt_manRs = {
+ DataObjectModelType,
+ "manRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout = {
+ DataAttributeModelType,
+ "sboTimeout",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_manRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stCt_hisRs = {
+ DataObjectModelType,
+ "hisRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_hisRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stCt_actCtVal = {
+ DataObjectModelType,
+ "actCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_actCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal = {
+ DataObjectModelType,
+ "oldCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_ctTot,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_ctTot = {
+ DataAttributeModelType,
+ "ctTot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_dly,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_dly = {
+ DataAttributeModelType,
+ "dly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_mly,
+ NULL,
+ 32,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_mly = {
+ DataAttributeModelType,
+ "mly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_yly,
+ NULL,
+ 13,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_yly = {
+ DataAttributeModelType,
+ "yly",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_tot,
+ NULL,
+ 21,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_tot = {
+ DataAttributeModelType,
+ "tot",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt_rsPer,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_rsPer = {
+ DataAttributeModelType,
+ "rsPer",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_stCt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_preTmms = {
+ DataAttributeModelType,
+ "preTmms",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_pstTmms,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_pstTmms = {
+ DataAttributeModelType,
+ "pstTmms",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_smpTmms,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_smpTmms = {
+ DataAttributeModelType,
+ "smpTmms",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt_datSetMx,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT16U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_TurSt_datSetMx = {
+ DataAttributeModelType,
+ "datSetMx",
+ (ModelNode*) &iedModel_WTG_WTUR1_TurSt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ VISIBLE_STRING_129,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_W = {
+ DataObjectModelType,
+ "W",
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_instMag,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_W_instMag = {
+ DataAttributeModelType,
+ "instMag",
+ (ModelNode*) &iedModel_WTG_WTUR1_W,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_mag,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_instMag_i,
+ 0,
+ IEC61850_FC_MX,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_instMag_i = {
+ DataAttributeModelType,
+ "i",
+ (ModelNode*) &iedModel_WTG_WTUR1_W_instMag,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_instMag_f,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_instMag_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_WTG_WTUR1_W_instMag,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ FLOAT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_mag = {
+ DataAttributeModelType,
+ "mag",
+ (ModelNode*) &iedModel_WTG_WTUR1_W,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_q,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_mag_i,
+ 0,
+ IEC61850_FC_MX,
+ CONSTRUCTED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_mag_i = {
+ DataAttributeModelType,
+ "i",
+ (ModelNode*) &iedModel_WTG_WTUR1_W_mag,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_mag_f,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_mag_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_WTG_WTUR1_W_mag,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ FLOAT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_W,
+ (ModelNode*) &iedModel_WTG_WTUR1_W_t,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_W_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_W,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp = {
+ DataObjectModelType,
+ "SetTurOp",
+ (ModelNode*) &iedModel_WTG_WTUR1,
+ NULL,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_actSt = {
+ DataObjectModelType,
+ "actSt",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_actSt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_oldSt = {
+ DataObjectModelType,
+ "oldSt",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_oldSt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm = {
+ DataObjectModelType,
+ "cmTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs = {
+ DataObjectModelType,
+ "manRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout = {
+ DataAttributeModelType,
+ "sboTimeout",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs = {
+ DataObjectModelType,
+ "hisRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal = {
+ DataObjectModelType,
+ "actTmVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal = {
+ DataObjectModelType,
+ "oldTmVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot = {
+ DataAttributeModelType,
+ "tmTot",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_dly,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_dly = {
+ DataAttributeModelType,
+ "dly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_mly,
+ NULL,
+ 32,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_mly = {
+ DataAttributeModelType,
+ "mly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_yly,
+ NULL,
+ 13,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_yly = {
+ DataAttributeModelType,
+ "yly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_tot,
+ NULL,
+ 21,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tot = {
+ DataAttributeModelType,
+ "tot",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer = {
+ DataAttributeModelType,
+ "rsPer",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmTm,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt = {
+ DataObjectModelType,
+ "cmCt",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmAcs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ 0
+};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs = {
+ DataObjectModelType,
+ "manRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout = {
+ DataAttributeModelType,
+ "sboTimeout",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs = {
+ DataObjectModelType,
+ "hisRs",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal = {
+ DataObjectModelType,
+ "actCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal = {
+ DataObjectModelType,
+ "oldCtVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal,
+ 0
+};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot = {
+ DataAttributeModelType,
+ "ctTot",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_dly,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_dly = {
+ DataAttributeModelType,
+ "dly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_mly,
+ NULL,
+ 32,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_mly = {
+ DataAttributeModelType,
+ "mly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_yly,
+ NULL,
+ 13,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_yly = {
+ DataAttributeModelType,
+ "yly",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_tot,
+ NULL,
+ 21,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_tot = {
+ DataAttributeModelType,
+ "tot",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer = {
+ DataAttributeModelType,
+ "rsPer",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp_cmCt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs = {
+ DataAttributeModelType,
+ "cmAcs",
+ (ModelNode*) &iedModel_WTG_WTUR1_SetTurOp,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+
+
+
+
+
+IedModel iedModel = {
+ "WIND",
+ &iedModel_WTG,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ initializeValues
+};
+
+static void
+initializeValues()
+{
+}
diff --git a/examples/server_example_61400_25/static_model.h b/examples/server_example_61400_25/static_model.h
new file mode 100644
index 0000000..c19af1c
--- /dev/null
+++ b/examples/server_example_61400_25/static_model.h
@@ -0,0 +1,681 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from wtur.icd
+ */
+
+#ifndef STATIC_MODEL_H_
+#define STATIC_MODEL_H_
+
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+extern LogicalDevice iedModel_WTG;
+extern LogicalNode iedModel_WTG_LLN0;
+extern DataObject iedModel_WTG_LLN0_Mod;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_operTm;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_T;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Test;
+extern DataAttribute iedModel_WTG_LLN0_Mod_Oper_Check;
+extern DataAttribute iedModel_WTG_LLN0_Mod_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Mod_q;
+extern DataAttribute iedModel_WTG_LLN0_Mod_t;
+extern DataAttribute iedModel_WTG_LLN0_Mod_ctlModel;
+extern DataObject iedModel_WTG_LLN0_Beh;
+extern DataAttribute iedModel_WTG_LLN0_Beh_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Beh_q;
+extern DataAttribute iedModel_WTG_LLN0_Beh_t;
+extern DataObject iedModel_WTG_LLN0_Health;
+extern DataAttribute iedModel_WTG_LLN0_Health_stVal;
+extern DataAttribute iedModel_WTG_LLN0_Health_q;
+extern DataAttribute iedModel_WTG_LLN0_Health_t;
+extern DataObject iedModel_WTG_LLN0_NamPlt;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_LLN0_NamPlt_configRev;
+extern LogicalNode iedModel_WTG_LPHD1;
+extern DataObject iedModel_WTG_LPHD1_NamPlt;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_LPHD1_NamPlt_configRev;
+extern DataObject iedModel_WTG_LPHD1_PhyNam;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_vendor;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_hwRev;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_swRev;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_serNum;
+extern DataAttribute iedModel_WTG_LPHD1_PhyNam_model;
+extern DataObject iedModel_WTG_LPHD1_PhyHealth;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_WTG_LPHD1_PhyHealth_t;
+extern DataObject iedModel_WTG_LPHD1_Proxy;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_q;
+extern DataAttribute iedModel_WTG_LPHD1_Proxy_t;
+extern LogicalNode iedModel_WTG_WTUR1;
+extern DataObject iedModel_WTG_WTUR1_NamPlt;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_vendor;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_swRev;
+extern DataAttribute iedModel_WTG_WTUR1_NamPlt_configRev;
+extern DataObject iedModel_WTG_WTUR1_TotWh;
+extern DataObject iedModel_WTG_WTUR1_TotWh_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TotWh_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TotWh_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_TotWh_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TotWh_rsPer;
+extern DataObject iedModel_WTG_WTUR1_TurSt;
+extern DataObject iedModel_WTG_WTUR1_TurSt_actSt;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_actSt_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_oldSt;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_oldSt_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_actTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tmTot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stTm_rsPer;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_dly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_mly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_yly;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_tot;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_stCt_rsPer;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_preTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_pstTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_smpTmms;
+extern DataAttribute iedModel_WTG_WTUR1_TurSt_datSetMx;
+extern DataObject iedModel_WTG_WTUR1_W;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag_i;
+extern DataAttribute iedModel_WTG_WTUR1_W_instMag_f;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag_i;
+extern DataAttribute iedModel_WTG_WTUR1_W_mag_f;
+extern DataAttribute iedModel_WTG_WTUR1_W_q;
+extern DataAttribute iedModel_WTG_WTUR1_W_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_actSt;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_oldSt;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_oldSt_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_dly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_mly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_yly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_tot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t;
+extern DataObject iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_dly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_mly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_yly;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_tot;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer;
+extern DataAttribute iedModel_WTG_WTUR1_SetTurOp_cmAcs;
+
+
+
+#define IEDMODEL_WTG (&iedModel_WTG)
+#define IEDMODEL_WTG_LLN0 (&iedModel_WTG_LLN0)
+#define IEDMODEL_WTG_LLN0_Mod (&iedModel_WTG_LLN0_Mod)
+#define IEDMODEL_WTG_LLN0_Mod_Oper (&iedModel_WTG_LLN0_Mod_Oper)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_ctlVal (&iedModel_WTG_LLN0_Mod_Oper_ctlVal)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_operTm (&iedModel_WTG_LLN0_Mod_Oper_operTm)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_origin (&iedModel_WTG_LLN0_Mod_Oper_origin)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_origin_orCat (&iedModel_WTG_LLN0_Mod_Oper_origin_orCat)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_origin_orIdent (&iedModel_WTG_LLN0_Mod_Oper_origin_orIdent)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_ctlNum (&iedModel_WTG_LLN0_Mod_Oper_ctlNum)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_T (&iedModel_WTG_LLN0_Mod_Oper_T)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_Test (&iedModel_WTG_LLN0_Mod_Oper_Test)
+#define IEDMODEL_WTG_LLN0_Mod_Oper_Check (&iedModel_WTG_LLN0_Mod_Oper_Check)
+#define IEDMODEL_WTG_LLN0_Mod_stVal (&iedModel_WTG_LLN0_Mod_stVal)
+#define IEDMODEL_WTG_LLN0_Mod_q (&iedModel_WTG_LLN0_Mod_q)
+#define IEDMODEL_WTG_LLN0_Mod_t (&iedModel_WTG_LLN0_Mod_t)
+#define IEDMODEL_WTG_LLN0_Mod_ctlModel (&iedModel_WTG_LLN0_Mod_ctlModel)
+#define IEDMODEL_WTG_LLN0_Beh (&iedModel_WTG_LLN0_Beh)
+#define IEDMODEL_WTG_LLN0_Beh_stVal (&iedModel_WTG_LLN0_Beh_stVal)
+#define IEDMODEL_WTG_LLN0_Beh_q (&iedModel_WTG_LLN0_Beh_q)
+#define IEDMODEL_WTG_LLN0_Beh_t (&iedModel_WTG_LLN0_Beh_t)
+#define IEDMODEL_WTG_LLN0_Health (&iedModel_WTG_LLN0_Health)
+#define IEDMODEL_WTG_LLN0_Health_stVal (&iedModel_WTG_LLN0_Health_stVal)
+#define IEDMODEL_WTG_LLN0_Health_q (&iedModel_WTG_LLN0_Health_q)
+#define IEDMODEL_WTG_LLN0_Health_t (&iedModel_WTG_LLN0_Health_t)
+#define IEDMODEL_WTG_LLN0_NamPlt (&iedModel_WTG_LLN0_NamPlt)
+#define IEDMODEL_WTG_LLN0_NamPlt_vendor (&iedModel_WTG_LLN0_NamPlt_vendor)
+#define IEDMODEL_WTG_LLN0_NamPlt_swRev (&iedModel_WTG_LLN0_NamPlt_swRev)
+#define IEDMODEL_WTG_LLN0_NamPlt_configRev (&iedModel_WTG_LLN0_NamPlt_configRev)
+#define IEDMODEL_WTG_LPHD1 (&iedModel_WTG_LPHD1)
+#define IEDMODEL_WTG_LPHD1_NamPlt (&iedModel_WTG_LPHD1_NamPlt)
+#define IEDMODEL_WTG_LPHD1_NamPlt_vendor (&iedModel_WTG_LPHD1_NamPlt_vendor)
+#define IEDMODEL_WTG_LPHD1_NamPlt_swRev (&iedModel_WTG_LPHD1_NamPlt_swRev)
+#define IEDMODEL_WTG_LPHD1_NamPlt_configRev (&iedModel_WTG_LPHD1_NamPlt_configRev)
+#define IEDMODEL_WTG_LPHD1_PhyNam (&iedModel_WTG_LPHD1_PhyNam)
+#define IEDMODEL_WTG_LPHD1_PhyNam_vendor (&iedModel_WTG_LPHD1_PhyNam_vendor)
+#define IEDMODEL_WTG_LPHD1_PhyNam_hwRev (&iedModel_WTG_LPHD1_PhyNam_hwRev)
+#define IEDMODEL_WTG_LPHD1_PhyNam_swRev (&iedModel_WTG_LPHD1_PhyNam_swRev)
+#define IEDMODEL_WTG_LPHD1_PhyNam_serNum (&iedModel_WTG_LPHD1_PhyNam_serNum)
+#define IEDMODEL_WTG_LPHD1_PhyNam_model (&iedModel_WTG_LPHD1_PhyNam_model)
+#define IEDMODEL_WTG_LPHD1_PhyHealth (&iedModel_WTG_LPHD1_PhyHealth)
+#define IEDMODEL_WTG_LPHD1_PhyHealth_stVal (&iedModel_WTG_LPHD1_PhyHealth_stVal)
+#define IEDMODEL_WTG_LPHD1_PhyHealth_q (&iedModel_WTG_LPHD1_PhyHealth_q)
+#define IEDMODEL_WTG_LPHD1_PhyHealth_t (&iedModel_WTG_LPHD1_PhyHealth_t)
+#define IEDMODEL_WTG_LPHD1_Proxy (&iedModel_WTG_LPHD1_Proxy)
+#define IEDMODEL_WTG_LPHD1_Proxy_stVal (&iedModel_WTG_LPHD1_Proxy_stVal)
+#define IEDMODEL_WTG_LPHD1_Proxy_q (&iedModel_WTG_LPHD1_Proxy_q)
+#define IEDMODEL_WTG_LPHD1_Proxy_t (&iedModel_WTG_LPHD1_Proxy_t)
+#define IEDMODEL_WTG_WTUR1 (&iedModel_WTG_WTUR1)
+#define IEDMODEL_WTG_WTUR1_NamPlt (&iedModel_WTG_WTUR1_NamPlt)
+#define IEDMODEL_WTG_WTUR1_NamPlt_vendor (&iedModel_WTG_WTUR1_NamPlt_vendor)
+#define IEDMODEL_WTG_WTUR1_NamPlt_swRev (&iedModel_WTG_WTUR1_NamPlt_swRev)
+#define IEDMODEL_WTG_WTUR1_NamPlt_configRev (&iedModel_WTG_WTUR1_NamPlt_configRev)
+#define IEDMODEL_WTG_WTUR1_TotWh (&iedModel_WTG_WTUR1_TotWh)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs (&iedModel_WTG_WTUR1_TotWh_manRs)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper (&iedModel_WTG_WTUR1_TotWh_manRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_operTm (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_origin (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_T (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_Test (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_Oper_Check (&iedModel_WTG_WTUR1_TotWh_manRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_stVal (&iedModel_WTG_WTUR1_TotWh_manRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_q (&iedModel_WTG_WTUR1_TotWh_manRs_q)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_t (&iedModel_WTG_WTUR1_TotWh_manRs_t)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_ctlModel (&iedModel_WTG_WTUR1_TotWh_manRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_sboTimeout (&iedModel_WTG_WTUR1_TotWh_manRs_sboTimeout)
+#define IEDMODEL_WTG_WTUR1_TotWh_manRs_sboClass (&iedModel_WTG_WTUR1_TotWh_manRs_sboClass)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs (&iedModel_WTG_WTUR1_TotWh_hisRs)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_operTm (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_origin (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_T (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_Test (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_Oper_Check (&iedModel_WTG_WTUR1_TotWh_hisRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_stVal (&iedModel_WTG_WTUR1_TotWh_hisRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_q (&iedModel_WTG_WTUR1_TotWh_hisRs_q)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_t (&iedModel_WTG_WTUR1_TotWh_hisRs_t)
+#define IEDMODEL_WTG_WTUR1_TotWh_hisRs_ctlModel (&iedModel_WTG_WTUR1_TotWh_hisRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TotWh_actCtVal (&iedModel_WTG_WTUR1_TotWh_actCtVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_actCtVal_stVal (&iedModel_WTG_WTUR1_TotWh_actCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_actCtVal_q (&iedModel_WTG_WTUR1_TotWh_actCtVal_q)
+#define IEDMODEL_WTG_WTUR1_TotWh_actCtVal_t (&iedModel_WTG_WTUR1_TotWh_actCtVal_t)
+#define IEDMODEL_WTG_WTUR1_TotWh_oldCtVal (&iedModel_WTG_WTUR1_TotWh_oldCtVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_oldCtVal_stVal (&iedModel_WTG_WTUR1_TotWh_oldCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TotWh_oldCtVal_q (&iedModel_WTG_WTUR1_TotWh_oldCtVal_q)
+#define IEDMODEL_WTG_WTUR1_TotWh_oldCtVal_t (&iedModel_WTG_WTUR1_TotWh_oldCtVal_t)
+#define IEDMODEL_WTG_WTUR1_TotWh_ctTot (&iedModel_WTG_WTUR1_TotWh_ctTot)
+#define IEDMODEL_WTG_WTUR1_TotWh_dly (&iedModel_WTG_WTUR1_TotWh_dly)
+#define IEDMODEL_WTG_WTUR1_TotWh_mly (&iedModel_WTG_WTUR1_TotWh_mly)
+#define IEDMODEL_WTG_WTUR1_TotWh_yly (&iedModel_WTG_WTUR1_TotWh_yly)
+#define IEDMODEL_WTG_WTUR1_TotWh_tot (&iedModel_WTG_WTUR1_TotWh_tot)
+#define IEDMODEL_WTG_WTUR1_TotWh_rsPer (&iedModel_WTG_WTUR1_TotWh_rsPer)
+#define IEDMODEL_WTG_WTUR1_TurSt (&iedModel_WTG_WTUR1_TurSt)
+#define IEDMODEL_WTG_WTUR1_TurSt_actSt (&iedModel_WTG_WTUR1_TurSt_actSt)
+#define IEDMODEL_WTG_WTUR1_TurSt_actSt_stVal (&iedModel_WTG_WTUR1_TurSt_actSt_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_actSt_q (&iedModel_WTG_WTUR1_TurSt_actSt_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_actSt_t (&iedModel_WTG_WTUR1_TurSt_actSt_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_oldSt (&iedModel_WTG_WTUR1_TurSt_oldSt)
+#define IEDMODEL_WTG_WTUR1_TurSt_oldSt_stVal (&iedModel_WTG_WTUR1_TurSt_oldSt_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_oldSt_q (&iedModel_WTG_WTUR1_TurSt_oldSt_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_oldSt_t (&iedModel_WTG_WTUR1_TurSt_oldSt_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm (&iedModel_WTG_WTUR1_TurSt_stTm)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs (&iedModel_WTG_WTUR1_TurSt_stTm_manRs)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_T (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_stVal (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_q (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_t (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_ctlModel (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboTimeout)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_manRs_sboClass (&iedModel_WTG_WTUR1_TurSt_stTm_manRs_sboClass)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_stVal (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_q (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_t (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel (&iedModel_WTG_WTUR1_TurSt_stTm_hisRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_actTmVal (&iedModel_WTG_WTUR1_TurSt_stTm_actTmVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_actTmVal_stVal (&iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_actTmVal_q (&iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_actTmVal_t (&iedModel_WTG_WTUR1_TurSt_stTm_actTmVal_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_oldTmVal (&iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal (&iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_oldTmVal_q (&iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_oldTmVal_t (&iedModel_WTG_WTUR1_TurSt_stTm_oldTmVal_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_tmTot (&iedModel_WTG_WTUR1_TurSt_stTm_tmTot)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_dly (&iedModel_WTG_WTUR1_TurSt_stTm_dly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_mly (&iedModel_WTG_WTUR1_TurSt_stTm_mly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_yly (&iedModel_WTG_WTUR1_TurSt_stTm_yly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_tot (&iedModel_WTG_WTUR1_TurSt_stTm_tot)
+#define IEDMODEL_WTG_WTUR1_TurSt_stTm_rsPer (&iedModel_WTG_WTUR1_TurSt_stTm_rsPer)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt (&iedModel_WTG_WTUR1_TurSt_stCt)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs (&iedModel_WTG_WTUR1_TurSt_stCt_manRs)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_T (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_stVal (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_q (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_t (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_ctlModel (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboTimeout)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_manRs_sboClass (&iedModel_WTG_WTUR1_TurSt_stCt_manRs_sboClass)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_stVal (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_q (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_t (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel (&iedModel_WTG_WTUR1_TurSt_stCt_hisRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_actCtVal (&iedModel_WTG_WTUR1_TurSt_stCt_actCtVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_actCtVal_stVal (&iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_actCtVal_q (&iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_actCtVal_t (&iedModel_WTG_WTUR1_TurSt_stCt_actCtVal_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_oldCtVal (&iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal (&iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_oldCtVal_q (&iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_q)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_oldCtVal_t (&iedModel_WTG_WTUR1_TurSt_stCt_oldCtVal_t)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_ctTot (&iedModel_WTG_WTUR1_TurSt_stCt_ctTot)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_dly (&iedModel_WTG_WTUR1_TurSt_stCt_dly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_mly (&iedModel_WTG_WTUR1_TurSt_stCt_mly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_yly (&iedModel_WTG_WTUR1_TurSt_stCt_yly)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_tot (&iedModel_WTG_WTUR1_TurSt_stCt_tot)
+#define IEDMODEL_WTG_WTUR1_TurSt_stCt_rsPer (&iedModel_WTG_WTUR1_TurSt_stCt_rsPer)
+#define IEDMODEL_WTG_WTUR1_TurSt_preTmms (&iedModel_WTG_WTUR1_TurSt_preTmms)
+#define IEDMODEL_WTG_WTUR1_TurSt_pstTmms (&iedModel_WTG_WTUR1_TurSt_pstTmms)
+#define IEDMODEL_WTG_WTUR1_TurSt_smpTmms (&iedModel_WTG_WTUR1_TurSt_smpTmms)
+#define IEDMODEL_WTG_WTUR1_TurSt_datSetMx (&iedModel_WTG_WTUR1_TurSt_datSetMx)
+#define IEDMODEL_WTG_WTUR1_W (&iedModel_WTG_WTUR1_W)
+#define IEDMODEL_WTG_WTUR1_W_instMag (&iedModel_WTG_WTUR1_W_instMag)
+#define IEDMODEL_WTG_WTUR1_W_instMag_i (&iedModel_WTG_WTUR1_W_instMag_i)
+#define IEDMODEL_WTG_WTUR1_W_instMag_f (&iedModel_WTG_WTUR1_W_instMag_f)
+#define IEDMODEL_WTG_WTUR1_W_mag (&iedModel_WTG_WTUR1_W_mag)
+#define IEDMODEL_WTG_WTUR1_W_mag_i (&iedModel_WTG_WTUR1_W_mag_i)
+#define IEDMODEL_WTG_WTUR1_W_mag_f (&iedModel_WTG_WTUR1_W_mag_f)
+#define IEDMODEL_WTG_WTUR1_W_q (&iedModel_WTG_WTUR1_W_q)
+#define IEDMODEL_WTG_WTUR1_W_t (&iedModel_WTG_WTUR1_W_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp (&iedModel_WTG_WTUR1_SetTurOp)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt (&iedModel_WTG_WTUR1_SetTurOp_actSt)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_operTm (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_origin (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_T (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_T)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_Test (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_Oper_Check (&iedModel_WTG_WTUR1_SetTurOp_actSt_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_stVal (&iedModel_WTG_WTUR1_SetTurOp_actSt_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_q (&iedModel_WTG_WTUR1_SetTurOp_actSt_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_t (&iedModel_WTG_WTUR1_SetTurOp_actSt_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_actSt_ctlModel (&iedModel_WTG_WTUR1_SetTurOp_actSt_ctlModel)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_oldSt (&iedModel_WTG_WTUR1_SetTurOp_oldSt)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_oldSt_stVal (&iedModel_WTG_WTUR1_SetTurOp_oldSt_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_oldSt_q (&iedModel_WTG_WTUR1_SetTurOp_oldSt_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_oldSt_t (&iedModel_WTG_WTUR1_SetTurOp_oldSt_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm (&iedModel_WTG_WTUR1_SetTurOp_cmTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_q (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_t (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboTimeout)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass (&iedModel_WTG_WTUR1_SetTurOp_cmTm_manRs_sboClass)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_q (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_t (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel (&iedModel_WTG_WTUR1_SetTurOp_cmTm_hisRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_actTmVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q (&iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t (&iedModel_WTG_WTUR1_SetTurOp_cmTm_actTmVal_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_oldTmVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q (&iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t (&iedModel_WTG_WTUR1_SetTurOp_cmTm_oldTmVal_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_tmTot (&iedModel_WTG_WTUR1_SetTurOp_cmTm_tmTot)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_dly (&iedModel_WTG_WTUR1_SetTurOp_cmTm_dly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_mly (&iedModel_WTG_WTUR1_SetTurOp_cmTm_mly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_yly (&iedModel_WTG_WTUR1_SetTurOp_cmTm_yly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_tot (&iedModel_WTG_WTUR1_SetTurOp_cmTm_tot)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmTm_rsPer (&iedModel_WTG_WTUR1_SetTurOp_cmTm_rsPer)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt (&iedModel_WTG_WTUR1_SetTurOp_cmCt)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_q (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_t (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboTimeout)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass (&iedModel_WTG_WTUR1_SetTurOp_cmCt_manRs_sboClass)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_operTm)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orCat)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_origin_orIdent)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_ctlNum)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_T)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Test)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_Oper_Check)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_q (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_t (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel (&iedModel_WTG_WTUR1_SetTurOp_cmCt_hisRs_ctlModel)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_actCtVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q (&iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t (&iedModel_WTG_WTUR1_SetTurOp_cmCt_actCtVal_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_oldCtVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal (&iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_stVal)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q (&iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_q)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t (&iedModel_WTG_WTUR1_SetTurOp_cmCt_oldCtVal_t)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_ctTot (&iedModel_WTG_WTUR1_SetTurOp_cmCt_ctTot)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_dly (&iedModel_WTG_WTUR1_SetTurOp_cmCt_dly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_mly (&iedModel_WTG_WTUR1_SetTurOp_cmCt_mly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_yly (&iedModel_WTG_WTUR1_SetTurOp_cmCt_yly)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_tot (&iedModel_WTG_WTUR1_SetTurOp_cmCt_tot)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmCt_rsPer (&iedModel_WTG_WTUR1_SetTurOp_cmCt_rsPer)
+#define IEDMODEL_WTG_WTUR1_SetTurOp_cmAcs (&iedModel_WTG_WTUR1_SetTurOp_cmAcs)
+
+#endif /* STATIC_MODEL_H_ */
+
diff --git a/examples/server_example_61400_25/wtur.icd b/examples/server_example_61400_25/wtur.icd
new file mode 100644
index 0000000..b7322a2
--- /dev/null
+++ b/examples/server_example_61400_25/wtur.icd
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+
+
+
+
+ 1 3 9999 33
+ 33
+ 00 00 00 01
+ 00 01
+ 00 01
+ 102
+ 10.0.2.2
+ 255.255.255.0
+ 10.0.2.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ not-supported
+ bay-control
+ station-control
+ remote-control
+ automatic-bay
+ automatic-station
+ automatic-remote
+ maintenance
+ process
+
+
+ status-only
+ direct-with-normal-security
+ sbo-with-normal-security
+ direct-with-enhanced-security
+ sbo-with-enhanced-security
+
+
+ operate-once
+ operate-many
+
+
+ pulse
+ persistent
+
+
+ dly
+ wly
+ mly
+ yly
+ manual
+
+
+ normal
+ high
+ low
+ high-high
+ low-low
+
+
+ none
+ m
+ kg
+ s
+ A
+ K
+ mol
+ cd
+ deg
+ rad
+ sr
+ Gy
+ q
+ °C
+ Sv
+ F
+ C
+ S
+ H
+ V
+ ohm
+ J
+ N
+ Hz
+ lx
+ Lm
+ Wb
+ T
+ W
+ Pa
+ m²
+ m³
+ m/s
+ m/s²
+ m³/s
+ m/m³
+ M
+ kg/m³
+ m²/s
+ W/m K
+ J/K
+ ppm
+ 1/s
+ rad/s
+ VA
+ Watts
+ VAr
+ theta
+ cos(theta)
+ Vs
+ V²
+ As
+ A²
+ A²t
+ VAh
+ Wh
+ VArh
+ V/Hz
+
+
+ Yocto
+ Zepto
+ Atto
+ Femto
+ Pico
+ Nano
+ Micro
+ Milli
+ Centi
+ Deci
+ zeroNoValue
+ Deca
+ Hecto
+ Kilo
+ Mega
+ Giga
+ Tera
+ Petra
+ Exa
+ Zetta
+ Yotta
+
+
+
diff --git a/examples/server_example_complex_array/CMakeLists.txt b/examples/server_example_complex_array/CMakeLists.txt
new file mode 100644
index 0000000..32a1f96
--- /dev/null
+++ b/examples/server_example_complex_array/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(server_example_ca_SRCS
+ server_example_ca.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_ca_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_ca
+ ${server_example_ca_SRCS}
+)
+
+target_link_libraries(server_example_ca
+ iec61850
+)
diff --git a/examples/server_example_complex_array/Makefile b/examples/server_example_complex_array/Makefile
new file mode 100644
index 0000000..124da8d
--- /dev/null
+++ b/examples/server_example_complex_array/Makefile
@@ -0,0 +1,26 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_ca
+PROJECT_SOURCES = server_example_ca.c
+PROJECT_SOURCES += static_model.c
+
+PROJECT_ICD_FILE = mhai_array.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_complex_array/mhai_array.icd b/examples/server_example_complex_array/mhai_array.icd
new file mode 100644
index 0000000..e6f09be
--- /dev/null
+++ b/examples/server_example_complex_array/mhai_array.icd
@@ -0,0 +1,294 @@
+
+
+
+
+
+ Station bus
+ 10
+
+
+ 10.0.0.2
+ 255.255.255.0
+ 10.0.0.1
+ 0001
+ 00000001
+ 0001
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ status-only
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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_complex_array/server_example_ca.c b/examples/server_example_complex_array/server_example_ca.c
new file mode 100644
index 0000000..23d729a
--- /dev/null
+++ b/examples/server_example_complex_array/server_example_ca.c
@@ -0,0 +1,129 @@
+/*
+ * server_example_ca.c
+ *
+ * This example shows how to handle complex arrays (arrays of data objects).
+ */
+
+#include "iec61850_server.h"
+#include "hal_thread.h"
+#include
+#include
+#include
+
+#include "static_model.h"
+
+#include
+
+/* import IEC 61850 device model created from ICD-File */
+extern IedModel iedModel;
+
+static int running = 0;
+
+static void
+sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+static void
+updateCMVArrayElement(MmsValue* cval, int index, float magnitude, float angle, Quality quality, Timestamp timestamp)
+{
+ MmsValue* cmv = MmsValue_getElement(cval, index);
+
+ MmsValue* cValElement = MmsValue_getElement(cmv, 0);
+
+ assert(MmsValue_getArraySize(cValElement) == 2);
+
+ MmsValue* cValElement_mag_f = MmsValue_getElement(MmsValue_getElement(cValElement, 0), 0);
+
+ MmsValue* cValElement_ang_f = MmsValue_getElement(MmsValue_getElement(cValElement, 1), 0);
+
+ MmsValue_setFloat(cValElement_mag_f, magnitude);
+ MmsValue_setFloat(cValElement_ang_f, angle);
+
+ MmsValue* q = MmsValue_getElement(cmv, 1);
+ MmsValue_setBitStringFromInteger(q, (int) quality);
+
+ MmsValue* t = MmsValue_getElement(cmv, 2);
+ MmsValue_setUtcTimeByBuffer(t, timestamp.val);
+}
+
+int main(int argc, char** argv) {
+
+ int tcpPort = 102;
+
+ if (argc > 1) {
+ tcpPort = atoi(argv[1]);
+ }
+
+ IedServer iedServer = IedServer_create(&iedModel);
+
+ /* Get access to the MHAI1.HA data object handle - for static and dynamic model*/
+ DataObject* mhai1_ha_phsAHar = (DataObject*)
+ IedModel_getModelNodeByObjectReference(&iedModel, "testComplexArray/MHAI1.HA.phsAHar");
+
+ /* alternative: only for static model */
+// DataObject* mhai1_ha_phsAHar = IEDMODEL_ComplexArray_MHAI1_HA_phsAHar;
+
+ assert(mhai1_ha_phsAHar != NULL);
+
+ /* Get access to the corresponding MMS value data structure - the MX(FC) part of the data object */
+ MmsValue* mhai1_ha_phsAHar_mx = IedServer_getFunctionalConstrainedData(iedServer, mhai1_ha_phsAHar, IEC61850_FC_MX);
+
+
+ /* assuming the array has 16 elements */
+ float mag = 200.f;
+ float angle = 0.01f;
+
+ Quality quality = QUALITY_VALIDITY_GOOD;
+ Timestamp timestamp;
+
+ Timestamp_setTimeInMilliseconds(×tamp, Hal_getTimeInMs());
+
+ int i;
+ for (i = 0; i < 16; i++) {
+ updateCMVArrayElement(mhai1_ha_phsAHar_mx, i, mag, angle, quality, timestamp);
+ mag += 1.f;
+ angle += 0.01f;
+ }
+
+ /* 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);
+
+ int counter = 0;
+
+ while (running) {
+ Thread_sleep(1000);
+
+ Timestamp_setTimeInMilliseconds(×tamp, Hal_getTimeInMs());
+
+ IedServer_lockDataModel(iedServer);
+ for (i = 0; i < 16; i++) {
+ updateCMVArrayElement(mhai1_ha_phsAHar_mx, i, mag, angle, quality, timestamp);
+ }
+ IedServer_unlockDataModel(iedServer);
+
+ if (counter == 10) {
+ /* Now a problem occurs - measurements are invalid */
+ quality = QUALITY_VALIDITY_INVALID | QUALITY_DETAIL_FAILURE;
+ }
+
+ counter++;
+ }
+
+ /* 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_complex_array/static_model.c b/examples/server_example_complex_array/static_model.c
new file mode 100644
index 0000000..458b189
--- /dev/null
+++ b/examples/server_example_complex_array/static_model.c
@@ -0,0 +1,610 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from mhai_array.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_ComplexArray;
+extern LogicalNode iedModel_ComplexArray_LLN0;
+extern DataObject iedModel_ComplexArray_LLN0_Mod;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_t;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel;
+extern DataObject iedModel_ComplexArray_LLN0_Beh;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_t;
+extern DataObject iedModel_ComplexArray_LLN0_Health;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_stVal;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_t;
+extern DataObject iedModel_ComplexArray_LLN0_NamPlt;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_ComplexArray_LPHD1;
+extern DataObject iedModel_ComplexArray_LPHD1_PhyNam;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor;
+extern DataObject iedModel_ComplexArray_LPHD1_PhyHealth;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t;
+extern DataObject iedModel_ComplexArray_LPHD1_Proxy;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t;
+extern LogicalNode iedModel_ComplexArray_MHAI1;
+extern DataObject iedModel_ComplexArray_MHAI1_HA;
+extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency;
+
+
+
+LogicalDevice iedModel_ComplexArray = {
+ LogicalDeviceModelType,
+ "ComplexArray",
+ (ModelNode*) &iedModel,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_LLN0
+};
+
+LogicalNode iedModel_ComplexArray_LLN0 = {
+ LogicalNodeModelType,
+ "LLN0",
+ (ModelNode*) &iedModel_ComplexArray,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod,
+};
+
+DataObject iedModel_ComplexArray_LLN0_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_ComplexArray_LLN0,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_q,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LLN0_Mod_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Mod_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_ComplexArray_LLN0_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_ComplexArray_LLN0,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_stVal,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Beh_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Beh_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Beh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_ComplexArray_LLN0_Health = {
+ DataObjectModelType,
+ "Health",
+ (ModelNode*) &iedModel_ComplexArray_LLN0,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health_stVal,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LLN0_Health_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Health_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_Health_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_Health,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_ComplexArray_LLN0_NamPlt = {
+ DataObjectModelType,
+ "NamPlt",
+ (ModelNode*) &iedModel_ComplexArray_LLN0,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_vendor,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_d,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d = {
+ DataAttributeModelType,
+ "d",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_configRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev = {
+ DataAttributeModelType,
+ "configRev",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt_ldNs,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs = {
+ DataAttributeModelType,
+ "ldNs",
+ (ModelNode*) &iedModel_ComplexArray_LLN0_NamPlt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_EX,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_ComplexArray_LPHD1 = {
+ LogicalNodeModelType,
+ "LPHD1",
+ (ModelNode*) &iedModel_ComplexArray,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyNam,
+};
+
+DataObject iedModel_ComplexArray_LPHD1_PhyNam = {
+ DataObjectModelType,
+ "PhyNam",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyNam_vendor,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyNam,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_ComplexArray_LPHD1_PhyHealth = {
+ DataObjectModelType,
+ "PhyHealth",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_stVal,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_PhyHealth,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_ComplexArray_LPHD1_Proxy = {
+ DataObjectModelType,
+ "Proxy",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_stVal,
+ 0
+};
+
+DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy,
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_LPHD1_Proxy,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_ComplexArray_MHAI1 = {
+ LogicalNodeModelType,
+ "MHAI1",
+ (ModelNode*) &iedModel_ComplexArray,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+};
+
+DataObject iedModel_ComplexArray_MHAI1_HA = {
+ DataObjectModelType,
+ "HA",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar,
+ 0
+};
+
+DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar = {
+ DataObjectModelType,
+ "phsAHar",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_numHar,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal,
+ 16
+};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal = {
+ DataAttributeModelType,
+ "cVal",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_q,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag,
+ 0,
+ IEC61850_FC_MX,
+ CONSTRUCTED,
+ 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag = {
+ DataAttributeModelType,
+ "mag",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f,
+ 0,
+ IEC61850_FC_MX,
+ CONSTRUCTED,
+ 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ FLOAT32,
+ 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang = {
+ DataAttributeModelType,
+ "ang",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal,
+ NULL,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f,
+ 0,
+ IEC61850_FC_MX,
+ CONSTRUCTED,
+ 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ FLOAT32,
+ 0 + TRG_OPT_DATA_CHANGED + TRG_OPT_DATA_UPDATE,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar_t,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_phsAHar,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_MX,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar = {
+ DataAttributeModelType,
+ "numHar",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_numCyc,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT16U,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc = {
+ DataAttributeModelType,
+ "numCyc",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_evalTm,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT16U,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm = {
+ DataAttributeModelType,
+ "evalTm",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA_frequency,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ INT16U,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency = {
+ DataAttributeModelType,
+ "frequency",
+ (ModelNode*) &iedModel_ComplexArray_MHAI1_HA,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ FLOAT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+
+
+
+
+
+IedModel iedModel = {
+ "test",
+ &iedModel_ComplexArray,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ initializeValues
+};
+
+static void
+initializeValues()
+{
+
+iedModel_ComplexArray_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
+
+iedModel_ComplexArray_MHAI1_HA_numHar.mmsValue = MmsValue_newUnsignedFromUint32(16);
+}
diff --git a/examples/server_example_complex_array/static_model.h b/examples/server_example_complex_array/static_model.h
new file mode 100644
index 0000000..0999d58
--- /dev/null
+++ b/examples/server_example_complex_array/static_model.h
@@ -0,0 +1,109 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from mhai_array.icd
+ */
+
+#ifndef STATIC_MODEL_H_
+#define STATIC_MODEL_H_
+
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+extern LogicalDevice iedModel_ComplexArray;
+extern LogicalNode iedModel_ComplexArray_LLN0;
+extern DataObject iedModel_ComplexArray_LLN0_Mod;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_t;
+extern DataAttribute iedModel_ComplexArray_LLN0_Mod_ctlModel;
+extern DataObject iedModel_ComplexArray_LLN0_Beh;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_stVal;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Beh_t;
+extern DataObject iedModel_ComplexArray_LLN0_Health;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_stVal;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_q;
+extern DataAttribute iedModel_ComplexArray_LLN0_Health_t;
+extern DataObject iedModel_ComplexArray_LLN0_NamPlt;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_d;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_ComplexArray_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_ComplexArray_LPHD1;
+extern DataObject iedModel_ComplexArray_LPHD1_PhyNam;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyNam_vendor;
+extern DataObject iedModel_ComplexArray_LPHD1_PhyHealth;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_ComplexArray_LPHD1_PhyHealth_t;
+extern DataObject iedModel_ComplexArray_LPHD1_Proxy;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_q;
+extern DataAttribute iedModel_ComplexArray_LPHD1_Proxy_t;
+extern LogicalNode iedModel_ComplexArray_MHAI1;
+extern DataObject iedModel_ComplexArray_MHAI1_HA;
+extern DataObject iedModel_ComplexArray_MHAI1_HA_phsAHar;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_q;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_phsAHar_t;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numHar;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_numCyc;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_evalTm;
+extern DataAttribute iedModel_ComplexArray_MHAI1_HA_frequency;
+
+
+
+#define IEDMODEL_ComplexArray (&iedModel_ComplexArray)
+#define IEDMODEL_ComplexArray_LLN0 (&iedModel_ComplexArray_LLN0)
+#define IEDMODEL_ComplexArray_LLN0_Mod (&iedModel_ComplexArray_LLN0_Mod)
+#define IEDMODEL_ComplexArray_LLN0_Mod_q (&iedModel_ComplexArray_LLN0_Mod_q)
+#define IEDMODEL_ComplexArray_LLN0_Mod_t (&iedModel_ComplexArray_LLN0_Mod_t)
+#define IEDMODEL_ComplexArray_LLN0_Mod_ctlModel (&iedModel_ComplexArray_LLN0_Mod_ctlModel)
+#define IEDMODEL_ComplexArray_LLN0_Beh (&iedModel_ComplexArray_LLN0_Beh)
+#define IEDMODEL_ComplexArray_LLN0_Beh_stVal (&iedModel_ComplexArray_LLN0_Beh_stVal)
+#define IEDMODEL_ComplexArray_LLN0_Beh_q (&iedModel_ComplexArray_LLN0_Beh_q)
+#define IEDMODEL_ComplexArray_LLN0_Beh_t (&iedModel_ComplexArray_LLN0_Beh_t)
+#define IEDMODEL_ComplexArray_LLN0_Health (&iedModel_ComplexArray_LLN0_Health)
+#define IEDMODEL_ComplexArray_LLN0_Health_stVal (&iedModel_ComplexArray_LLN0_Health_stVal)
+#define IEDMODEL_ComplexArray_LLN0_Health_q (&iedModel_ComplexArray_LLN0_Health_q)
+#define IEDMODEL_ComplexArray_LLN0_Health_t (&iedModel_ComplexArray_LLN0_Health_t)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt (&iedModel_ComplexArray_LLN0_NamPlt)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt_vendor (&iedModel_ComplexArray_LLN0_NamPlt_vendor)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt_swRev (&iedModel_ComplexArray_LLN0_NamPlt_swRev)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt_d (&iedModel_ComplexArray_LLN0_NamPlt_d)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt_configRev (&iedModel_ComplexArray_LLN0_NamPlt_configRev)
+#define IEDMODEL_ComplexArray_LLN0_NamPlt_ldNs (&iedModel_ComplexArray_LLN0_NamPlt_ldNs)
+#define IEDMODEL_ComplexArray_LPHD1 (&iedModel_ComplexArray_LPHD1)
+#define IEDMODEL_ComplexArray_LPHD1_PhyNam (&iedModel_ComplexArray_LPHD1_PhyNam)
+#define IEDMODEL_ComplexArray_LPHD1_PhyNam_vendor (&iedModel_ComplexArray_LPHD1_PhyNam_vendor)
+#define IEDMODEL_ComplexArray_LPHD1_PhyHealth (&iedModel_ComplexArray_LPHD1_PhyHealth)
+#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_stVal (&iedModel_ComplexArray_LPHD1_PhyHealth_stVal)
+#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_q (&iedModel_ComplexArray_LPHD1_PhyHealth_q)
+#define IEDMODEL_ComplexArray_LPHD1_PhyHealth_t (&iedModel_ComplexArray_LPHD1_PhyHealth_t)
+#define IEDMODEL_ComplexArray_LPHD1_Proxy (&iedModel_ComplexArray_LPHD1_Proxy)
+#define IEDMODEL_ComplexArray_LPHD1_Proxy_stVal (&iedModel_ComplexArray_LPHD1_Proxy_stVal)
+#define IEDMODEL_ComplexArray_LPHD1_Proxy_q (&iedModel_ComplexArray_LPHD1_Proxy_q)
+#define IEDMODEL_ComplexArray_LPHD1_Proxy_t (&iedModel_ComplexArray_LPHD1_Proxy_t)
+#define IEDMODEL_ComplexArray_MHAI1 (&iedModel_ComplexArray_MHAI1)
+#define IEDMODEL_ComplexArray_MHAI1_HA (&iedModel_ComplexArray_MHAI1_HA)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar (&iedModel_ComplexArray_MHAI1_HA_phsAHar)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_mag (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_mag_f)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_ang (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f (&iedModel_ComplexArray_MHAI1_HA_phsAHar_cVal_ang_f)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_q (&iedModel_ComplexArray_MHAI1_HA_phsAHar_q)
+#define IEDMODEL_ComplexArray_MHAI1_HA_phsAHar_t (&iedModel_ComplexArray_MHAI1_HA_phsAHar_t)
+#define IEDMODEL_ComplexArray_MHAI1_HA_numHar (&iedModel_ComplexArray_MHAI1_HA_numHar)
+#define IEDMODEL_ComplexArray_MHAI1_HA_numCyc (&iedModel_ComplexArray_MHAI1_HA_numCyc)
+#define IEDMODEL_ComplexArray_MHAI1_HA_evalTm (&iedModel_ComplexArray_MHAI1_HA_evalTm)
+#define IEDMODEL_ComplexArray_MHAI1_HA_frequency (&iedModel_ComplexArray_MHAI1_HA_frequency)
+
+#endif /* STATIC_MODEL_H_ */
+
diff --git a/examples/server_example_config_file/CMakeLists.txt b/examples/server_example_config_file/CMakeLists.txt
new file mode 100644
index 0000000..e56ea25
--- /dev/null
+++ b/examples/server_example_config_file/CMakeLists.txt
@@ -0,0 +1,20 @@
+include_directories(
+ .
+)
+
+set(server_example_config_file_SRCS
+ server_example_config_file.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_config_file_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_config_file
+ ${server_example_config_file_SRCS}
+)
+
+target_link_libraries(server_example_config_file
+ iec61850
+)
diff --git a/examples/server_example_config_file/Makefile b/examples/server_example_config_file/Makefile
new file mode 100644
index 0000000..687747f
--- /dev/null
+++ b/examples/server_example_config_file/Makefile
@@ -0,0 +1,24 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_config_file
+PROJECT_SOURCES = server_example_config_file.c
+
+PROJECT_ICD_FILE = simpleIO_direct_control_goose.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/genconfig.jar $(PROJECT_ICD_FILE) > vmd-filestore/model.cfg
+
+$(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_config_file/server_example_config_file.c b/examples/server_example_config_file/server_example_config_file.c
new file mode 100644
index 0000000..924707b
--- /dev/null
+++ b/examples/server_example_config_file/server_example_config_file.c
@@ -0,0 +1,139 @@
+/*
+ * server_example_config_file.c
+ *
+ * This example shows how to use dynamic server data model with a configuration file.
+ *
+ * - How to open and parse the model configuration file
+ * - How to access data attributes by object reference strings
+ * - How to access data attributes by short addresses
+ *
+ * Note: If building with cmake the vmd-filestore folder containing the configuration file
+ * (model.cfg) has to be copied to the folder where the example is executed!
+ * The configuration file can be created from the SCL(ICD) file with the Java tool genconfig.jar
+ * that is included in the source distribution of libiec61580.
+ *
+ */
+
+#include "iec61850_server.h"
+#include "hal_thread.h"
+#include
+#include
+#include
+
+#include "hal_filesystem.h"
+#include "iec61850_config_file_parser.h"
+
+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]);
+ }
+
+ /* open configuration file */
+ FileHandle configFile = FileSystem_openFile("model.cfg", false);
+
+ if (configFile == NULL) {
+ printf("Error opening config file!\n");
+ return 1;
+ }
+
+ /* parse the configuration file and create the data model */
+ IedModel* model = ConfigFileParser_createModelFromConfigFile(configFile);
+
+ FileSystem_closeFile(configFile);
+
+ if (model == NULL) {
+ printf("Error parsing config file!\n");
+ return 1;
+ }
+
+ IedServer iedServer = IedServer_create(model);
+
+ /* Access to data attributes by object reference */
+
+ DataAttribute* anIn1_mag_f = (DataAttribute*)
+ IedModel_getModelNodeByObjectReference(model, "simpleIOGenericIO/GGIO1.AnIn1.mag.f");
+
+ DataAttribute* anIn1_t = (DataAttribute*)
+ IedModel_getModelNodeByObjectReference(model, "simpleIOGenericIO/GGIO1.AnIn1.t");
+
+ if (anIn1_mag_f == NULL)
+ printf("Error getting AnIn1.mag.f data attribute!\n");
+
+ /* Access to data attributes by short address */
+ DataAttribute* anIn2_mag = (DataAttribute*)
+ IedModel_getModelNodeByShortAddress(model, 101);
+
+ DataAttribute* anIn2_t = (DataAttribute*)
+ IedModel_getModelNodeByShortAddress(model, 102);
+
+ DataAttribute* anIn2_mag_f = NULL;
+
+ if (anIn2_mag == NULL)
+ printf("Error getting AnIn2.mag data attribute!\n");
+ else
+ anIn2_mag_f = (DataAttribute*) ModelNode_getChild((ModelNode*) anIn2_mag, "f");
+
+ 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);
+
+ float val = 0.f;
+
+ MmsValue* floatValue = MmsValue_newFloat(val);
+
+ while (running) {
+
+ if (anIn1_mag_f != NULL) {
+ MmsValue_setFloat(floatValue, val);
+
+ IedServer_lockDataModel(iedServer);
+
+ MmsValue_setUtcTimeMs(anIn1_t->mmsValue, Hal_getTimeInMs());
+ IedServer_updateAttributeValue(iedServer, anIn1_mag_f, floatValue);
+
+ IedServer_unlockDataModel(iedServer);
+ }
+
+ if (anIn2_mag_f != NULL) {
+ MmsValue_setFloat(floatValue, 0.f - val);
+
+ IedServer_lockDataModel(iedServer);
+
+ MmsValue_setUtcTimeMs(anIn2_t->mmsValue, Hal_getTimeInMs());
+ IedServer_updateAttributeValue(iedServer, anIn2_mag_f, floatValue);
+
+ IedServer_unlockDataModel(iedServer);
+ }
+
+ val += 0.1f;
+
+ Thread_sleep(100);
+ }
+
+ MmsValue_delete(floatValue);
+
+ IedServer_stop(iedServer);
+
+ IedServer_destroy(iedServer);
+
+ IedModel_destroy(model);
+} /* main() */
diff --git a/examples/server_example_config_file/simpleIO_direct_control_goose.icd b/examples/server_example_config_file/simpleIO_direct_control_goose.icd
new file mode 100644
index 0000000..e66f9a9
--- /dev/null
+++ b/examples/server_example_config_file/simpleIO_direct_control_goose.icd
@@ -0,0 +1,247 @@
+
+
+
+
+
+ Station bus
+
+
+
+ 111
+ 4
+ 01-0c-cd-01-00-01
+ 1000
+
+
+
+
+ 111
+ 4
+ 01-0c-cd-01-00-01
+ 1000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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_config_file/vmd-filestore/model.cfg b/examples/server_example_config_file/vmd-filestore/model.cfg
new file mode 100644
index 0000000..bcd616e
--- /dev/null
+++ b/examples/server_example_config_file/vmd-filestore/model.cfg
@@ -0,0 +1,206 @@
+Dynamic model generator
+parse data type templates ...
+parse IED section ...
+parse communication section ...
+Found connectedAP accessPoint1 for IED simpleIO
+MODEL(simpleIO){
+LD(GenericIO){
+LN(LLN0){
+DO(Mod 0){
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+DA(ctlModel 0 12 4 0 0)=0;
+}
+DO(Beh 0){
+DA(stVal 0 3 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Health 0){
+DA(stVal 0 3 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(NamPlt 0){
+DA(vendor 0 20 5 0 0);
+DA(swRev 0 20 5 0 0);
+DA(d 0 20 5 0 0);
+DA(configRev 0 20 5 0 0);
+DA(ldNs 0 20 11 0 0);
+}
+DS(Events){
+DE(GGIO1$ST$SPCSO1$stVal);
+DE(GGIO1$ST$SPCSO2$stVal);
+DE(GGIO1$ST$SPCSO3$stVal);
+DE(GGIO1$ST$SPCSO4$stVal);
+}
+DS(AnalogValues){
+DE(GGIO1$MX$AnIn1);
+DE(GGIO1$MX$AnIn2);
+DE(GGIO1$MX$AnIn3);
+DE(GGIO1$MX$AnIn4);
+}
+RC(EventsRCB01 Events 0 Events 1 8 111 50 1000);
+RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 8 111 50 1000);
+GC(gcbEvents events Events 2 0 -1 -1 ){
+PA(4 111 1000 010ccd010001);
+}
+GC(gcbAnalogValues analog AnalogValues 2 0 -1 -1 ){
+PA(4 111 1000 010ccd010001);
+}
+}
+LN(LPHD1){
+DO(PhyNam 0){
+DA(vendor 0 20 5 0 0);
+}
+DO(PhyHealth 0){
+DA(stVal 0 3 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Proxy 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+}
+LN(GGIO1){
+DO(Mod 0){
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+DA(ctlModel 0 12 4 0 0)=0;
+}
+DO(Beh 0){
+DA(stVal 0 3 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Health 0){
+DA(stVal 0 3 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(NamPlt 0){
+DA(vendor 0 20 5 0 0);
+DA(swRev 0 20 5 0 0);
+DA(d 0 20 5 0 0);
+}
+DO(AnIn1 0){
+DA(mag 0 27 1 1 0){
+DA(f 0 10 1 1 0);
+}
+DA(q 0 23 1 2 0);
+DA(t 0 22 1 0 0);
+}
+DO(AnIn2 0){
+DA(mag 0 27 1 1 101){
+DA(f 0 10 1 1 0);
+}
+DA(q 0 23 1 2 0);
+DA(t 0 22 1 0 102);
+}
+DO(AnIn3 0){
+DA(mag 0 27 1 1 0){
+DA(f 0 10 1 1 0);
+}
+DA(q 0 23 1 2 0);
+DA(t 0 22 1 0 0);
+}
+DO(AnIn4 0){
+DA(mag 0 27 1 1 0){
+DA(f 0 10 1 1 0);
+}
+DA(q 0 23 1 2 0);
+DA(t 0 22 1 0 0);
+}
+DO(SPCSO1 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(Oper 0 27 12 0 0){
+DA(ctlVal 0 0 12 0 0);
+DA(origin 0 27 12 0 0){
+DA(orCat 0 12 12 0 0);
+DA(orIdent 0 13 12 0 0);
+}
+DA(ctlNum 0 6 12 0 0);
+DA(T 0 22 12 0 0);
+DA(Test 0 0 12 0 0);
+DA(Check 0 24 12 0 0);
+}
+DA(ctlModel 0 12 4 0 0)=1;
+DA(t 0 22 0 0 0);
+}
+DO(SPCSO2 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(Oper 0 27 12 0 0){
+DA(ctlVal 0 0 12 0 0);
+DA(origin 0 27 12 0 0){
+DA(orCat 0 12 12 0 0);
+DA(orIdent 0 13 12 0 0);
+}
+DA(ctlNum 0 6 12 0 0);
+DA(T 0 22 12 0 0);
+DA(Test 0 0 12 0 0);
+DA(Check 0 24 12 0 0);
+}
+DA(ctlModel 0 12 4 0 0)=1;
+DA(t 0 22 0 0 0);
+}
+DO(SPCSO3 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(Oper 0 27 12 0 0){
+DA(ctlVal 0 0 12 0 0);
+DA(origin 0 27 12 0 0){
+DA(orCat 0 12 12 0 0);
+DA(orIdent 0 13 12 0 0);
+}
+DA(ctlNum 0 6 12 0 0);
+DA(T 0 22 12 0 0);
+DA(Test 0 0 12 0 0);
+DA(Check 0 24 12 0 0);
+}
+DA(ctlModel 0 12 4 0 0)=1;
+DA(t 0 22 0 0 0);
+}
+DO(SPCSO4 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(Oper 0 27 12 0 0){
+DA(ctlVal 0 0 12 0 0);
+DA(origin 0 27 12 0 0){
+DA(orCat 0 12 12 0 0);
+DA(orIdent 0 13 12 0 0);
+}
+DA(ctlNum 0 6 12 0 0);
+DA(T 0 22 12 0 0);
+DA(Test 0 0 12 0 0);
+DA(Check 0 24 12 0 0);
+}
+DA(ctlModel 0 12 4 0 0)=1;
+DA(t 0 22 0 0 0);
+}
+DO(Ind1 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Ind2 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Ind3 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+DO(Ind4 0){
+DA(stVal 0 0 0 1 0);
+DA(q 0 23 0 2 0);
+DA(t 0 22 0 0 0);
+}
+}
+}
+}
diff --git a/examples/server_example_control/CMakeLists.txt b/examples/server_example_control/CMakeLists.txt
new file mode 100644
index 0000000..da6f9c6
--- /dev/null
+++ b/examples/server_example_control/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(server_example_control_SRCS
+ server_example_control.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_control_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_control
+ ${server_example_control_SRCS}
+)
+
+target_link_libraries(server_example_control
+ iec61850
+)
diff --git a/examples/server_example_control/Makefile b/examples/server_example_control/Makefile
new file mode 100644
index 0000000..f537715
--- /dev/null
+++ b/examples/server_example_control/Makefile
@@ -0,0 +1,26 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_control
+PROJECT_SOURCES = server_example_control.c
+PROJECT_SOURCES += static_model.c
+
+PROJECT_ICD_FILE = simpleIO_control_tests.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_control/server_example_control.c b/examples/server_example_control/server_example_control.c
new file mode 100644
index 0000000..24aa7c3
--- /dev/null
+++ b/examples/server_example_control/server_example_control.c
@@ -0,0 +1,144 @@
+/*
+ * server_example_control.c
+ *
+ * How to use the different control handlers (TBD)
+ */
+
+#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 CheckHandlerResult
+checkHandler(void* parameter, MmsValue* ctlVal, bool test, bool interlockCheck, ClientConnection connection)
+{
+ printf("check handler called!\n");
+
+ if (interlockCheck)
+ printf(" with interlock check bit set!\n");
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1)
+ return CONTROL_ACCEPTED;
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2)
+ return CONTROL_ACCEPTED;
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3)
+ return CONTROL_ACCEPTED;
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4)
+ return CONTROL_ACCEPTED;
+
+ if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO9)
+ return CONTROL_ACCEPTED;
+
+ return CONTROL_OBJECT_UNDEFINED;
+}
+
+static ControlHandlerResult
+controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test)
+{
+ 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);
+ }
+
+ else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timestamp);
+ IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);
+ }
+
+ else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timestamp);
+ IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);
+ }
+
+ else if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timestamp);
+ IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);
+ }
+ else
+ return CONTROL_RESULT_FAILED;
+
+ return CONTROL_RESULT_OK;
+}
+
+int
+main(int argc, char** argv)
+{
+
+ iedServer = IedServer_create(&iedModel);
+
+ 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);
+
+ /* this is optional - performs operative checks */
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, checkHandler,
+ 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);
+
+ /* this is optional - performs operative checks */
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, checkHandler,
+ IEDMODEL_GenericIO_GGIO1_SPCSO4);
+
+
+ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO9,
+ (ControlHandler) controlHandlerForBinaryOutput,
+ IEDMODEL_GenericIO_GGIO1_SPCSO9);
+
+ /* this is optional - performs operative checks */
+ IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO9, checkHandler,
+ IEDMODEL_GenericIO_GGIO1_SPCSO9);
+
+ /* 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(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_control/simpleIO_control_tests.icd b/examples/server_example_control/simpleIO_control_tests.icd
new file mode 100644
index 0000000..6bfd88c
--- /dev/null
+++ b/examples/server_example_control/simpleIO_control_tests.icd
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+ 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
+
+
+
+
+ sbo-with-normal-security
+
+
+
+
+ direct-with-enhanced-security
+
+
+
+
+ sbo-with-enhanced-security
+
+
+
+
+ direct-with-normal-security
+
+
+
+
+ sbo-with-normal-security
+
+
+
+
+ direct-with-enhanced-security
+
+
+
+
+ sbo-with-enhanced-security
+
+
+
+
+ direct-with-enhanced-security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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_control/static_model.c b/examples/server_example_control/static_model.c
new file mode 100644
index 0000000..fe05859
--- /dev/null
+++ b/examples/server_example_control/static_model.c
@@ -0,0 +1,4220 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from simpleIO_control_tests.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_GenericIO;
+extern LogicalNode iedModel_GenericIO_LLN0;
+extern DataObject iedModel_GenericIO_LLN0_Mod;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_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_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_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_sboClass;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO5;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO6;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_SBO;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO7;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO8;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO9;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_ctlModel;
+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;
+
+
+
+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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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_Oper,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ CHECK,
+ 0,
+ NULL,
+ 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,
+ 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_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO2 = {
+ DataObjectModelType,
+ "SPCSO2",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_SBO,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO = {
+ DataAttributeModelType,
+ "SBO",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ VISIBLE_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 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,
+ 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_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_sboClass,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_sboClass = {
+ DataAttributeModelType,
+ "sboClass",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO3 = {
+ DataObjectModelType,
+ "SPCSO3",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 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,
+ 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_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO4 = {
+ DataObjectModelType,
+ "SPCSO4",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw = {
+ DataAttributeModelType,
+ "SBOw",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_SBOw,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 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,
+ 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_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO5 = {
+ DataObjectModelType,
+ "SPCSO5",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5,
+ NULL,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO5_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO6 = {
+ DataObjectModelType,
+ "SPCSO6",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_SBO,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_SBO = {
+ DataAttributeModelType,
+ "SBO",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ VISIBLE_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO6,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO7 = {
+ DataObjectModelType,
+ "SPCSO7",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO7,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO8 = {
+ DataObjectModelType,
+ "SPCSO8",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw = {
+ DataAttributeModelType,
+ "SBOw",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_SBOw,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat,
+ 0,
+ IEC61850_FC_ST,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_stVal,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO8,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_GenericIO_GGIO1_SPCSO9 = {
+ DataObjectModelType,
+ "SPCSO9",
+ (ModelNode*) &iedModel_GenericIO_GGIO1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ 0
+};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel = {
+ DataAttributeModelType,
+ "Cancel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_stVal,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_Cancel,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO9,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+
+
+
+
+
+IedModel iedModel = {
+ "simpleIO",
+ &iedModel_GenericIO,
+ 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(2);
+
+iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(3);
+
+iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(4);
+
+iedModel_GenericIO_GGIO1_SPCSO5_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1);
+
+iedModel_GenericIO_GGIO1_SPCSO6_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(2);
+
+iedModel_GenericIO_GGIO1_SPCSO7_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(3);
+
+iedModel_GenericIO_GGIO1_SPCSO8_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(4);
+
+iedModel_GenericIO_GGIO1_SPCSO9_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(3);
+}
diff --git a/examples/server_example_control/static_model.h b/examples/server_example_control/static_model.h
new file mode 100644
index 0000000..67c3967
--- /dev/null
+++ b/examples/server_example_control/static_model.h
@@ -0,0 +1,633 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from simpleIO_control_tests.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_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_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_SBO;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_sboClass;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check;
+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_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO5;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO6;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_SBO;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO6_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO7;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO7_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO8;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO8_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO9;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO9_ctlModel;
+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_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_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_SBO (&iedModel_GenericIO_GGIO1_SPCSO2_SBO)
+#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_Cancel (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Cancel_Test)
+#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_t (&iedModel_GenericIO_GGIO1_SPCSO2_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO2_sboClass (&iedModel_GenericIO_GGIO1_SPCSO2_sboClass)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3)
+#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_Cancel (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Cancel_Test)
+#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_t (&iedModel_GenericIO_GGIO1_SPCSO3_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_origin (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_T (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_Test (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_SBOw_Check (&iedModel_GenericIO_GGIO1_SPCSO4_SBOw_Check)
+#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_Cancel (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Cancel_Test)
+#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_t (&iedModel_GenericIO_GGIO1_SPCSO4_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5 (&iedModel_GenericIO_GGIO1_SPCSO5)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper (&iedModel_GenericIO_GGIO1_SPCSO5_Oper)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_operTm (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO5_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_stVal (&iedModel_GenericIO_GGIO1_SPCSO5_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_q (&iedModel_GenericIO_GGIO1_SPCSO5_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_t (&iedModel_GenericIO_GGIO1_SPCSO5_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO5_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO5_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO5_Cancel_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6 (&iedModel_GenericIO_GGIO1_SPCSO6)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_SBO (&iedModel_GenericIO_GGIO1_SPCSO6_SBO)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper (&iedModel_GenericIO_GGIO1_SPCSO6_Oper)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_operTm (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO6_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_operTm (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO6_Cancel_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_stVal (&iedModel_GenericIO_GGIO1_SPCSO6_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_q (&iedModel_GenericIO_GGIO1_SPCSO6_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_t (&iedModel_GenericIO_GGIO1_SPCSO6_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO6_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO6_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7 (&iedModel_GenericIO_GGIO1_SPCSO7)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper (&iedModel_GenericIO_GGIO1_SPCSO7_Oper)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_operTm (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO7_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_operTm (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO7_Cancel_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_stVal (&iedModel_GenericIO_GGIO1_SPCSO7_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_q (&iedModel_GenericIO_GGIO1_SPCSO7_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_t (&iedModel_GenericIO_GGIO1_SPCSO7_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO7_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO7_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8 (&iedModel_GenericIO_GGIO1_SPCSO8)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_operTm (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_origin (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_T (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_Test (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_SBOw_Check (&iedModel_GenericIO_GGIO1_SPCSO8_SBOw_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper (&iedModel_GenericIO_GGIO1_SPCSO8_Oper)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_operTm (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO8_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_operTm (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_operTm)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO8_Cancel_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_origin (&iedModel_GenericIO_GGIO1_SPCSO8_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO8_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO8_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO8_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_stVal (&iedModel_GenericIO_GGIO1_SPCSO8_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_q (&iedModel_GenericIO_GGIO1_SPCSO8_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_t (&iedModel_GenericIO_GGIO1_SPCSO8_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO8_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO8_ctlModel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9 (&iedModel_GenericIO_GGIO1_SPCSO9)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper (&iedModel_GenericIO_GGIO1_SPCSO9_Oper)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO9_Oper_Check)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_origin (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orCat)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_origin_orIdent)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_ctlNum)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_T (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_T)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_Cancel_Test (&iedModel_GenericIO_GGIO1_SPCSO9_Cancel_Test)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_stVal (&iedModel_GenericIO_GGIO1_SPCSO9_stVal)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_q (&iedModel_GenericIO_GGIO1_SPCSO9_q)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_t (&iedModel_GenericIO_GGIO1_SPCSO9_t)
+#define IEDMODEL_GenericIO_GGIO1_SPCSO9_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO9_ctlModel)
+#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_dynamic/CMakeLists.txt b/examples/server_example_dynamic/CMakeLists.txt
new file mode 100644
index 0000000..ebc14fc
--- /dev/null
+++ b/examples/server_example_dynamic/CMakeLists.txt
@@ -0,0 +1,20 @@
+include_directories(
+ .
+)
+
+set(server_example_dynamic_SRCS
+ server_example_dynamic.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_dynamic_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_dynamic
+ ${server_example_dynamic_SRCS}
+)
+
+target_link_libraries(server_example_dynamic
+ iec61850
+)
diff --git a/examples/server_example_dynamic/Makefile b/examples/server_example_dynamic/Makefile
new file mode 100644
index 0000000..5db8d54
--- /dev/null
+++ b/examples/server_example_dynamic/Makefile
@@ -0,0 +1,19 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_dynamic
+PROJECT_SOURCES = server_example_dynamic.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/server_example_dynamic/server_example_dynamic.c b/examples/server_example_dynamic/server_example_dynamic.c
new file mode 100644
index 0000000..49dccbc
--- /dev/null
+++ b/examples/server_example_dynamic/server_example_dynamic.c
@@ -0,0 +1,103 @@
+/*
+ * server_example_dynamic.c
+ *
+ * This example shows how to build a data model at runtime by API calls.
+ *
+ */
+
+#include "iec61850_server.h"
+#include "hal_thread.h"
+#include
+#include
+#include
+
+
+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]);
+ }
+
+ /*********************
+ * Setup data model
+ ********************/
+
+ IedModel* model = IedModel_create("testmodel");
+
+ LogicalDevice* lDevice1 = LogicalDevice_create("SENSORS", model);
+
+ LogicalNode* lln0 = LogicalNode_create("LLN0", lDevice1);
+
+ DataObject* lln0_mod = CDC_ENS_create("Mod", (ModelNode*) lln0, 0);
+ DataObject* lln0_health = CDC_ENS_create("Health", (ModelNode*) lln0, 0);
+
+ SettingGroupControlBlock_create(lln0, 1, 1);
+
+ /* Add a temperature sensor LN */
+ LogicalNode* ttmp1 = LogicalNode_create("TTMP1", lDevice1);
+ DataObject* ttmp1_tmpsv = CDC_SAV_create("TmpSv", (ModelNode*) ttmp1, 0, false);
+
+ DataAttribute* temperatureValue = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "instMag.f");
+ DataAttribute* temperatureTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "t");
+
+ DataSet* dataSet = DataSet_create("events", lln0);
+ DataSetEntry_create(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, NULL);
+
+ uint8_t rptOptions = RPT_OPT_SEQ_NUM | RPT_OPT_TIME_STAMP | RPT_OPT_REASON_FOR_INCLUSION;
+
+ ReportControlBlock_create("events01", lln0, "events01", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
+ ReportControlBlock_create("events02", lln0, "events02", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
+
+ /*********************
+ * run server
+ ********************/
+
+ IedServer iedServer = IedServer_create(model);
+
+ /* 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);
+
+ float val = 0.f;
+
+ while (running) {
+ IedServer_lockDataModel(iedServer);
+
+ MmsValue_setFloat(temperatureValue->mmsValue, val);
+ MmsValue_setUtcTimeMs(temperatureTimestamp->mmsValue, Hal_getTimeInMs());
+ IedServer_updateAttributeValue(iedServer, temperatureValue, temperatureValue->mmsValue);
+
+ IedServer_unlockDataModel(iedServer);
+
+ val += 0.1f;
+
+ Thread_sleep(100);
+ }
+
+ /* stop MMS server - close TCP server socket and all client sockets */
+ IedServer_stop(iedServer);
+
+ /* Cleanup - free all resources */
+ IedServer_destroy(iedServer);
+
+ /* destroy dynamic data model */
+ IedModel_destroy(model);
+} /* main() */
diff --git a/examples/server_example_goose/CMakeLists.txt b/examples/server_example_goose/CMakeLists.txt
new file mode 100644
index 0000000..7265858
--- /dev/null
+++ b/examples/server_example_goose/CMakeLists.txt
@@ -0,0 +1,23 @@
+include_directories(
+ .
+)
+
+set(server_example_goose_SRCS
+ server_example_goose.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_goose_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_goose
+ ${server_example_goose_SRCS}
+)
+
+target_link_libraries(server_example_goose
+ iec61850
+)
+
+
diff --git a/examples/server_example_goose/Makefile b/examples/server_example_goose/Makefile
new file mode 100644
index 0000000..25b326c
--- /dev/null
+++ b/examples/server_example_goose/Makefile
@@ -0,0 +1,25 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_goose
+PROJECT_SOURCES = server_example_goose.c
+PROJECT_SOURCES += static_model.c
+
+PROJECT_ICD_FILE = simpleIO_direct_control_goose.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_goose/server_example_goose.c b/examples/server_example_goose/server_example_goose.c
new file mode 100644
index 0000000..7f0681d
--- /dev/null
+++ b/examples/server_example_goose/server_example_goose.c
@@ -0,0 +1,114 @@
+/*
+ * server_example_goose.c
+ *
+ * This example demonstrates how to use GOOSE publishing, Reporting and the
+ * control model.
+ *
+ */
+
+#include "iec61850_server.h"
+#include "hal_thread.h" /* for Thread_sleep() */
+#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;
+}
+
+void
+controlHandlerForBinaryOutput(void* parameter, MmsValue* value)
+{
+ 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);
+ }
+}
+
+int main(int argc, char** argv) {
+
+ iedServer = IedServer_create(&iedModel);
+
+ if (argc > 1) {
+ char* ethernetIfcID = argv[1];
+
+ printf("Using GOOSE interface: %s\n", ethernetIfcID);
+ IedServer_setGooseInterfaceId(iedServer, ethernetIfcID);
+ }
+
+ /* MMS server will be instructed to start listening to client connections. */
+ IedServer_start(iedServer, 102);
+
+ 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);
+
+ if (!IedServer_isRunning(iedServer)) {
+ printf("Starting server failed! Exit.\n");
+ IedServer_destroy(iedServer);
+ exit(-1);
+ }
+
+ /* Start GOOSE publishing */
+ IedServer_enableGoosePublishing(iedServer);
+
+ running = 1;
+
+ signal(SIGINT, sigint_handler);
+
+ float anIn1 = 0.f;
+
+ while (running) {
+
+ IedServer_lockDataModel(iedServer);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, Hal_getTimeInMs());
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, anIn1);
+
+ IedServer_unlockDataModel(iedServer);
+
+ anIn1 += 0.1;
+
+ Thread_sleep(1000);
+ }
+
+ /* 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_goose/simpleIO_direct_control_goose.icd b/examples/server_example_goose/simpleIO_direct_control_goose.icd
new file mode 100644
index 0000000..4adbf3f
--- /dev/null
+++ b/examples/server_example_goose/simpleIO_direct_control_goose.icd
@@ -0,0 +1,261 @@
+
+
+
+
+
+ Station bus
+ 10
+
+
+ 10.0.0.2
+ 255.255.255.0
+ 10.0.0.1
+ 0001
+ 00000001
+ 0001
+
+
+
+ 1
+ 4
+ 01-0c-cd-01-00-01
+ 1000
+
+
+
+
+ 1
+ 4
+ 01-0c-cd-01-00-01
+ 1000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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_goose/static_model.c b/examples/server_example_goose/static_model.c
new file mode 100644
index 0000000..8c60853
--- /dev/null
+++ b/examples/server_example_goose/static_model.c
@@ -0,0 +1,2024 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from simpleIO_direct_control_goose.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_GenericIO;
+extern LogicalNode iedModel_GenericIO_LLN0;
+extern DataObject iedModel_GenericIO_LLN0_Mod;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_t;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_LLN0_Beh;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_t;
+extern DataObject iedModel_GenericIO_LLN0_Health;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_t;
+extern DataObject iedModel_GenericIO_LLN0_NamPlt;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_GenericIO_LPHD1;
+extern DataObject iedModel_GenericIO_LPHD1_PhyNam;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor;
+extern DataObject iedModel_GenericIO_LPHD1_PhyHealth;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t;
+extern DataObject iedModel_GenericIO_LPHD1_Proxy;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t;
+extern LogicalNode iedModel_GenericIO_GGIO1;
+extern DataObject iedModel_GenericIO_GGIO1_Mod;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_Beh;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t;
+extern DataObject iedModel_GenericIO_GGIO1_Health;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_t;
+extern DataObject iedModel_GenericIO_GGIO1_NamPlt;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn1;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn2;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn3;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn4;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO1;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind1;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind2;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind3;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind4;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
+
+extern DataSet ds_GenericIO_LLN0_Events;
+extern DataSet ds_GenericIO_LLN0_AnalogValues;
+
+
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3;
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO1$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda1
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO2$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda2
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO3$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda3
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO4$stVal",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_GenericIO_LLN0_Events = {
+ "GenericIO",
+ "LLN0$Events",
+ 4,
+ &ds_GenericIO_LLN0_Events_fcda0,
+ &ds_GenericIO_LLN0_AnalogValues
+};
+
+extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda0;
+extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda1;
+extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda2;
+extern DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda3;
+
+DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda0 = {
+ "GenericIO",
+ false,
+ "GGIO1$MX$AnIn1",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_AnalogValues_fcda1
+};
+
+DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda1 = {
+ "GenericIO",
+ false,
+ "GGIO1$MX$AnIn2",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_AnalogValues_fcda2
+};
+
+DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda2 = {
+ "GenericIO",
+ false,
+ "GGIO1$MX$AnIn3",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_AnalogValues_fcda3
+};
+
+DataSetEntry ds_GenericIO_LLN0_AnalogValues_fcda3 = {
+ "GenericIO",
+ false,
+ "GGIO1$MX$AnIn4",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_GenericIO_LLN0_AnalogValues = {
+ "GenericIO",
+ "LLN0$AnalogValues",
+ 4,
+ &ds_GenericIO_LLN0_AnalogValues_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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
+extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
+
+ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1};
+ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "AnalogValuesRCB01", "AnalogValues", false, "AnalogValues", 1, 8, 111, 50, 1000, NULL};
+
+extern GSEControlBlock iedModel_GenericIO_LLN0_gse0;
+extern GSEControlBlock iedModel_GenericIO_LLN0_gse1;
+
+static PhyComAddress iedModel_GenericIO_LLN0_gse0_address = {
+ 4,
+ 1,
+ 1000,
+ {0x1, 0xc, 0xcd, 0x1, 0x0, 0x1}
+};
+
+GSEControlBlock iedModel_GenericIO_LLN0_gse0 = {&iedModel_GenericIO_LLN0, "gcbEvents", "events", "Events", 2, false, &iedModel_GenericIO_LLN0_gse0_address, 1000, 3000, &iedModel_GenericIO_LLN0_gse1};
+
+static PhyComAddress iedModel_GenericIO_LLN0_gse1_address = {
+ 4,
+ 1,
+ 1000,
+ {0x1, 0xc, 0xcd, 0x1, 0x0, 0x1}
+};
+
+GSEControlBlock iedModel_GenericIO_LLN0_gse1 = {&iedModel_GenericIO_LLN0, "gcbAnalogValues", "analog", "AnalogValues", 2, false, &iedModel_GenericIO_LLN0_gse1_address, -1, -1, NULL};
+
+
+
+IedModel iedModel = {
+ "simpleIO",
+ &iedModel_GenericIO,
+ &ds_GenericIO_LLN0_Events,
+ &iedModel_GenericIO_LLN0_report0,
+ &iedModel_GenericIO_LLN0_gse0,
+ 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_goose/static_model.h b/examples/server_example_goose/static_model.h
new file mode 100644
index 0000000..5e827db
--- /dev/null
+++ b/examples/server_example_goose/static_model.h
@@ -0,0 +1,299 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from simpleIO_direct_control_goose.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_setting_groups/CMakeLists.txt b/examples/server_example_setting_groups/CMakeLists.txt
new file mode 100644
index 0000000..cb2d3cf
--- /dev/null
+++ b/examples/server_example_setting_groups/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(server_example_sg_SRCS
+ server_example_sg.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_sg_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_sg
+ ${server_example_sg_SRCS}
+)
+
+target_link_libraries(server_example_sg
+ iec61850
+)
diff --git a/examples/server_example_setting_groups/Makefile b/examples/server_example_setting_groups/Makefile
new file mode 100644
index 0000000..236aff4
--- /dev/null
+++ b/examples/server_example_setting_groups/Makefile
@@ -0,0 +1,24 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_sg
+PROJECT_SOURCES = server_example_sg.c
+PROJECT_SOURCES += static_model.c
+
+PROJECT_ICD_FILE = sg_demo.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_example_setting_groups/server_example_sg.c b/examples/server_example_setting_groups/server_example_sg.c
new file mode 100644
index 0000000..eb588f8
--- /dev/null
+++ b/examples/server_example_setting_groups/server_example_sg.c
@@ -0,0 +1,149 @@
+/*
+ * server_example_sg.c
+ */
+
+#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 IedServer iedServer;
+static int running = 0;
+
+typedef struct {
+ float strVal;
+ int opDlTmms;
+ int rsDlTmms;
+ int rstTms;
+} PTOC1Settings;
+
+
+static PTOC1Settings ptoc1Settings[] = {
+ {1.0f, 500, 500, 500},
+ {2.0f, 1500, 2500, 750},
+ {3.0f, 500, 1500, 750},
+ {3.5f, 1250, 1750, 500},
+ {3.75f, 1250, 1750, 750}
+};
+
+void sigint_handler(int signalId)
+{
+ running = 0;
+}
+
+static void
+loadActiveSgValues (int actSG)
+{
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_PROT_PTOC1_StrVal_setMag_f, ptoc1Settings[actSG - 1].strVal);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_OpDlTmms_setVal, ptoc1Settings[actSG - 1].opDlTmms);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_RsDlTmms_setVal, ptoc1Settings[actSG - 1].rsDlTmms);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_RstTms_setVal, ptoc1Settings[actSG - 1].rstTms);
+}
+
+static void
+loadEditSgValues (int editSG)
+{
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_StrVal_setMag_f, ptoc1Settings[editSG - 1].strVal);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_OpDlTmms_setVal, ptoc1Settings[editSG - 1].opDlTmms);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_RsDlTmms_setVal, ptoc1Settings[editSG - 1].rsDlTmms);
+ IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_RstTms_setVal, ptoc1Settings[editSG - 1].rstTms);
+}
+
+static bool
+activeSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
+ uint8_t newActSg, ClientConnection connection)
+{
+ printf("Switch to setting group %i\n", (int) newActSg);
+
+ loadActiveSgValues(newActSg);
+
+ return true;
+}
+
+static bool
+editSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
+ uint8_t newEditSg, ClientConnection connection)
+{
+ printf("Set edit setting group to %i\n", (int) newEditSg);
+
+ loadEditSgValues(newEditSg);
+
+ return true;
+}
+
+static void
+editSgConfirmedHandler(void* parameter, SettingGroupControlBlock* sgcb,
+ uint8_t editSg)
+{
+ printf("Received edit sg confirm for sg %i\n", editSg);
+
+ ptoc1Settings[editSg - 1].strVal = MmsValue_toFloat(IEDMODEL_SE_PROT_PTOC1_StrVal_setMag_f->mmsValue);
+ ptoc1Settings[editSg - 1].opDlTmms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_OpDlTmms_setVal->mmsValue);
+ ptoc1Settings[editSg - 1].rsDlTmms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_RsDlTmms_setVal->mmsValue);
+ ptoc1Settings[editSg - 1].rstTms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_RstTms_setVal->mmsValue);
+
+ if (IedServer_getActiveSettingGroup(iedServer, sgcb) == editSg) {
+ loadActiveSgValues(editSg);
+ }
+}
+
+
+int
+main(int argc, char** argv)
+{
+ iedServer = IedServer_create(&iedModel);
+
+ LogicalDevice* ld = IEDMODEL_PROT;
+
+ SettingGroupControlBlock* sgcb = LogicalDevice_getSettingGroupControlBlock(ld);
+
+ loadActiveSgValues(sgcb->actSG);
+
+ IedServer_setActiveSettingGroupChangedHandler(iedServer, sgcb, activeSgChangedHandler, NULL);
+ IedServer_setEditSettingGroupChangedHandler(iedServer, sgcb, editSgChangedHandler, NULL);
+ IedServer_setEditSettingGroupConfirmationHandler(iedServer, sgcb, editSgConfirmedHandler, 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 power = 500.f;
+
+ while (running) {
+
+ uint64_t timeval = Hal_getTimeInMs();
+
+ IedServer_lockDataModel(iedServer);
+
+ 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_example_setting_groups/sg_demo.icd b/examples/server_example_setting_groups/sg_demo.icd
new file mode 100644
index 0000000..ef3bef8
--- /dev/null
+++ b/examples/server_example_setting_groups/sg_demo.icd
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ status-only
+
+
+
+
+ MZ Automation
+
+
+ 1.0
+
+
+ 1
+
+
+ Setting group demo
+
+
+
+ IEC 61850-7-4:2007
+
+
+
+
+
+
+
+
+
+ MZ Automation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ none
+ m
+ kg
+ s
+ A
+ K
+ mol
+ cd
+ deg
+ rad
+ sr
+ Gy
+ q
+ °C
+ Sv
+ F
+ C
+ S
+ H
+ V
+ ohm
+ J
+ N
+ Hz
+ lx
+ Lm
+ Wb
+ T
+ W
+ Pa
+ m²
+ m³
+ m/s
+ m/s²
+ m³/s
+ m/m³
+ M
+ kg/m³
+ m²/s
+ W/m K
+ J/K
+ ppm
+ 1/s
+ rad/s
+ VA
+ Watts
+ VAr
+ phi
+ cos_phi
+ Vs
+ V²
+ As
+ A²
+ A²t
+ VAh
+ Wh
+ VArh
+ V/Hz
+
+
+
+ y
+ z
+ a
+ f
+ p
+ n
+ µ
+ m
+ c
+ d
+
+ da
+ h
+ k
+ M
+ G
+ T
+ P
+ E
+ Z
+ Y
+
+
+
+
+
+
+
+
+ status-only
+ direct-with-normal-security
+ sbo-with-normal-security
+ direct-with-enhanced-security
+ sbo-with-enhanced-security
+
+
+
+ ok
+ warning
+ alarm
+
+
+
+ not-supported
+ reserved1
+ station-control
+ remote-control
+ reserved2
+ automatic-station
+ automatic-remote
+ maintenance
+ process
+
+
+
+
+ normal
+ high
+ low
+ high-high
+ low-low
+
+
+
+ on
+ on-blocked
+ test
+ test/blocked
+ off
+
+
+
+ unknown
+ forward
+ backward
+ both
+
+
+
+ e1
+ e2
+ e3
+ e4
+ e5
+
+
+
+
diff --git a/examples/server_example_setting_groups/static_model.c b/examples/server_example_setting_groups/static_model.c
new file mode 100644
index 0000000..af84056
--- /dev/null
+++ b/examples/server_example_setting_groups/static_model.c
@@ -0,0 +1,1229 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from sg_demo.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_PROT;
+extern LogicalNode iedModel_PROT_LLN0;
+extern DataObject iedModel_PROT_LLN0_Mod;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_operTm;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_T;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Test;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Check;
+extern DataAttribute iedModel_PROT_LLN0_Mod_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Mod_q;
+extern DataAttribute iedModel_PROT_LLN0_Mod_t;
+extern DataAttribute iedModel_PROT_LLN0_Mod_ctlModel;
+extern DataObject iedModel_PROT_LLN0_Beh;
+extern DataAttribute iedModel_PROT_LLN0_Beh_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Beh_q;
+extern DataAttribute iedModel_PROT_LLN0_Beh_t;
+extern DataObject iedModel_PROT_LLN0_Health;
+extern DataAttribute iedModel_PROT_LLN0_Health_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Health_q;
+extern DataAttribute iedModel_PROT_LLN0_Health_t;
+extern DataObject iedModel_PROT_LLN0_NamPlt;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_d;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_PROT_LPHD1;
+extern DataObject iedModel_PROT_LPHD1_PhyNam;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_vendor;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_hwRev;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_swRev;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_serNum;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_model;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_location;
+extern DataObject iedModel_PROT_LPHD1_PhyHealth;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_t;
+extern DataObject iedModel_PROT_LPHD1_Proxy;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_q;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_t;
+extern LogicalNode iedModel_PROT_PTOC1;
+extern DataObject iedModel_PROT_PTOC1_Beh;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_stVal;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_q;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_t;
+extern DataObject iedModel_PROT_PTOC1_Mod;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_operTm;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_T;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Test;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Check;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_stVal;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_q;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_t;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_ctlModel;
+extern DataObject iedModel_PROT_PTOC1_Str;
+extern DataAttribute iedModel_PROT_PTOC1_Str_general;
+extern DataAttribute iedModel_PROT_PTOC1_Str_dirGeneral;
+extern DataAttribute iedModel_PROT_PTOC1_Str_q;
+extern DataAttribute iedModel_PROT_PTOC1_Str_t;
+extern DataObject iedModel_PROT_PTOC1_Op;
+extern DataAttribute iedModel_PROT_PTOC1_Op_general;
+extern DataAttribute iedModel_PROT_PTOC1_Op_q;
+extern DataAttribute iedModel_PROT_PTOC1_Op_t;
+extern DataObject iedModel_PROT_PTOC1_StrVal;
+extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag;
+extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag_f;
+extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag;
+extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag_f;
+extern DataObject iedModel_PROT_PTOC1_OpDlTmms;
+extern DataAttribute iedModel_PROT_PTOC1_OpDlTmms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_OpDlTmms_setVal;
+extern DataObject iedModel_PROT_PTOC1_RsDlTmms;
+extern DataAttribute iedModel_PROT_PTOC1_RsDlTmms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_RsDlTmms_setVal;
+extern DataObject iedModel_PROT_PTOC1_RstTms;
+extern DataAttribute iedModel_PROT_PTOC1_RstTms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal;
+
+
+
+LogicalDevice iedModel_PROT = {
+ LogicalDeviceModelType,
+ "PROT",
+ (ModelNode*) &iedModel,
+ NULL,
+ (ModelNode*) &iedModel_PROT_LLN0
+};
+
+LogicalNode iedModel_PROT_LLN0 = {
+ LogicalNodeModelType,
+ "LLN0",
+ (ModelNode*) &iedModel_PROT,
+ (ModelNode*) &iedModel_PROT_LPHD1,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+};
+
+DataObject iedModel_PROT_LLN0_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_PROT_LLN0,
+ (ModelNode*) &iedModel_PROT_LLN0_Beh,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ 0
+};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_stVal,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_ctlNum,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+ (ModelNode*) &iedModel_PROT_LLN0_Mod_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_PROT_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_LLN0_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_PROT_LLN0,
+ (ModelNode*) &iedModel_PROT_LLN0_Health,
+ (ModelNode*) &iedModel_PROT_LLN0_Beh_stVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_LLN0_Beh_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_LLN0_Beh,
+ (ModelNode*) &iedModel_PROT_LLN0_Beh_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Beh_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_LLN0_Beh,
+ (ModelNode*) &iedModel_PROT_LLN0_Beh_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Beh_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_LLN0_Beh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_LLN0_Health = {
+ DataObjectModelType,
+ "Health",
+ (ModelNode*) &iedModel_PROT_LLN0,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ (ModelNode*) &iedModel_PROT_LLN0_Health_stVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_LLN0_Health_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_LLN0_Health,
+ (ModelNode*) &iedModel_PROT_LLN0_Health_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Health_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_LLN0_Health,
+ (ModelNode*) &iedModel_PROT_LLN0_Health_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_Health_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_LLN0_Health,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_LLN0_NamPlt = {
+ DataObjectModelType,
+ "NamPlt",
+ (ModelNode*) &iedModel_PROT_LLN0,
+ NULL,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt_vendor,
+ 0
+};
+
+DataAttribute iedModel_PROT_LLN0_NamPlt_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_NamPlt_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt_d,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_NamPlt_d = {
+ DataAttributeModelType,
+ "d",
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt_configRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_NamPlt_configRev = {
+ DataAttributeModelType,
+ "configRev",
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt_ldNs,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LLN0_NamPlt_ldNs = {
+ DataAttributeModelType,
+ "ldNs",
+ (ModelNode*) &iedModel_PROT_LLN0_NamPlt,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_EX,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_PROT_LPHD1 = {
+ LogicalNodeModelType,
+ "LPHD1",
+ (ModelNode*) &iedModel_PROT,
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+};
+
+DataObject iedModel_PROT_LPHD1_PhyNam = {
+ DataObjectModelType,
+ "PhyNam",
+ (ModelNode*) &iedModel_PROT_LPHD1,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_vendor,
+ 0
+};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_vendor = {
+ DataAttributeModelType,
+ "vendor",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_hwRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_hwRev = {
+ DataAttributeModelType,
+ "hwRev",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_swRev,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_swRev = {
+ DataAttributeModelType,
+ "swRev",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_serNum,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_serNum = {
+ DataAttributeModelType,
+ "serNum",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_model,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_model = {
+ DataAttributeModelType,
+ "model",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam_location,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyNam_location = {
+ DataAttributeModelType,
+ "location",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyNam,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_DC,
+ VISIBLE_STRING_255,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_LPHD1_PhyHealth = {
+ DataObjectModelType,
+ "PhyHealth",
+ (ModelNode*) &iedModel_PROT_LPHD1,
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth_stVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_LPHD1_PhyHealth_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyHealth_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth,
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_PhyHealth_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_LPHD1_PhyHealth,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_LPHD1_Proxy = {
+ DataObjectModelType,
+ "Proxy",
+ (ModelNode*) &iedModel_PROT_LPHD1,
+ NULL,
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy_stVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_LPHD1_Proxy_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy,
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_Proxy_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy,
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_LPHD1_Proxy_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_LPHD1_Proxy,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+LogicalNode iedModel_PROT_PTOC1 = {
+ LogicalNodeModelType,
+ "PTOC1",
+ (ModelNode*) &iedModel_PROT,
+ NULL,
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh,
+};
+
+DataObject iedModel_PROT_PTOC1_Beh = {
+ DataObjectModelType,
+ "Beh",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh_stVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_Beh_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh,
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Beh_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh,
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Beh_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_PTOC1_Beh,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_Mod = {
+ DataObjectModelType,
+ "Mod",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_Str,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper = {
+ DataAttributeModelType,
+ "Oper",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_stVal,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_ctlVal,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlVal = {
+ DataAttributeModelType,
+ "ctlVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_operTm,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_operTm = {
+ DataAttributeModelType,
+ "operTm",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin = {
+ DataAttributeModelType,
+ "origin",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_ctlNum,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin_orCat,
+ 0,
+ IEC61850_FC_CO,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orCat = {
+ DataAttributeModelType,
+ "orCat",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent = {
+ DataAttributeModelType,
+ "orIdent",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_origin,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ OCTET_STRING_64,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlNum = {
+ DataAttributeModelType,
+ "ctlNum",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_T,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ INT8U,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_T = {
+ DataAttributeModelType,
+ "T",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_Test,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Test = {
+ DataAttributeModelType,
+ "Test",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper_Check,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ BOOLEAN,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Check = {
+ DataAttributeModelType,
+ "Check",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_Oper,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CO,
+ CHECK,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_stVal = {
+ DataAttributeModelType,
+ "stVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod_ctlModel,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_PROT_PTOC1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_Str = {
+ DataObjectModelType,
+ "Str",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_Op,
+ (ModelNode*) &iedModel_PROT_PTOC1_Str_general,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_Str_general = {
+ DataAttributeModelType,
+ "general",
+ (ModelNode*) &iedModel_PROT_PTOC1_Str,
+ (ModelNode*) &iedModel_PROT_PTOC1_Str_dirGeneral,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Str_dirGeneral = {
+ DataAttributeModelType,
+ "dirGeneral",
+ (ModelNode*) &iedModel_PROT_PTOC1_Str,
+ (ModelNode*) &iedModel_PROT_PTOC1_Str_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ ENUMERATED,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Str_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_PTOC1_Str,
+ (ModelNode*) &iedModel_PROT_PTOC1_Str_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Str_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_PTOC1_Str,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_Op = {
+ DataObjectModelType,
+ "Op",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal,
+ (ModelNode*) &iedModel_PROT_PTOC1_Op_general,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_Op_general = {
+ DataAttributeModelType,
+ "general",
+ (ModelNode*) &iedModel_PROT_PTOC1_Op,
+ (ModelNode*) &iedModel_PROT_PTOC1_Op_q,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ BOOLEAN,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Op_q = {
+ DataAttributeModelType,
+ "q",
+ (ModelNode*) &iedModel_PROT_PTOC1_Op,
+ (ModelNode*) &iedModel_PROT_PTOC1_Op_t,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ QUALITY,
+ 0 + TRG_OPT_QUALITY_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_Op_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_PROT_PTOC1_Op,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_StrVal = {
+ DataObjectModelType,
+ "StrVal",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_OpDlTmms,
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal_setMag,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_StrVal_setMag = {
+ DataAttributeModelType,
+ "setMag",
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal,
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_StrVal_setMag,
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal_setMag_f,
+ 0,
+ IEC61850_FC_SG,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_PROT_PTOC1_StrVal_setMag_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal_setMag,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_SG,
+ FLOAT32,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag = {
+ DataAttributeModelType,
+ "setMag",
+ (ModelNode*) &iedModel_PROT_PTOC1_StrVal,
+ NULL,
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_StrVal_setMag_f,
+ 0,
+ IEC61850_FC_SE,
+ CONSTRUCTED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag_f = {
+ DataAttributeModelType,
+ "f",
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_StrVal_setMag,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_SE,
+ FLOAT32,
+ 0,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_OpDlTmms = {
+ DataObjectModelType,
+ "OpDlTmms",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_RsDlTmms,
+ (ModelNode*) &iedModel_PROT_PTOC1_OpDlTmms_setVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_OpDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_OpDlTmms,
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_OpDlTmms_setVal,
+ NULL,
+ 0,
+ IEC61850_FC_SG,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_SE_PROT_PTOC1_OpDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_OpDlTmms,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_SE,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_RsDlTmms = {
+ DataObjectModelType,
+ "RsDlTmms",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ (ModelNode*) &iedModel_PROT_PTOC1_RstTms,
+ (ModelNode*) &iedModel_PROT_PTOC1_RsDlTmms_setVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_RsDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_RsDlTmms,
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_RsDlTmms_setVal,
+ NULL,
+ 0,
+ IEC61850_FC_SG,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_SE_PROT_PTOC1_RsDlTmms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_RsDlTmms,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_SE,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataObject iedModel_PROT_PTOC1_RstTms = {
+ DataObjectModelType,
+ "RstTms",
+ (ModelNode*) &iedModel_PROT_PTOC1,
+ NULL,
+ (ModelNode*) &iedModel_PROT_PTOC1_RstTms_setVal,
+ 0
+};
+
+DataAttribute iedModel_PROT_PTOC1_RstTms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_RstTms,
+ (ModelNode*) &iedModel_SE_PROT_PTOC1_RstTms_setVal,
+ NULL,
+ 0,
+ IEC61850_FC_SG,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal = {
+ DataAttributeModelType,
+ "setVal",
+ (ModelNode*) &iedModel_PROT_PTOC1_RstTms,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_SE,
+ INT32,
+ 0 + TRG_OPT_DATA_CHANGED,
+ NULL,
+ 0};
+
+
+
+
+extern SettingGroupControlBlock iedModel_PROT_LLN0_sgcb;
+
+SettingGroupControlBlock iedModel_PROT_LLN0_sgcb = {&iedModel_PROT_LLN0, 1, 5, 0, false, 0, 0, NULL};
+
+
+IedModel iedModel = {
+ "DEMO",
+ &iedModel_PROT,
+ NULL,
+ NULL,
+ NULL,
+ &iedModel_PROT_LLN0_sgcb,
+ initializeValues
+};
+
+static void
+initializeValues()
+{
+
+iedModel_PROT_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
+
+iedModel_PROT_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation");
+
+iedModel_PROT_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("1.0");
+
+iedModel_PROT_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("Setting group demo");
+
+iedModel_PROT_LLN0_NamPlt_configRev.mmsValue = MmsValue_newVisibleString("1");
+
+iedModel_PROT_LLN0_NamPlt_ldNs.mmsValue = MmsValue_newVisibleString("IEC 61850-7-4:2007");
+
+iedModel_PROT_LPHD1_PhyNam_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation");
+}
diff --git a/examples/server_example_setting_groups/static_model.h b/examples/server_example_setting_groups/static_model.h
new file mode 100644
index 0000000..06cf0b8
--- /dev/null
+++ b/examples/server_example_setting_groups/static_model.h
@@ -0,0 +1,199 @@
+/*
+ * static_model.h
+ *
+ * automatically generated from sg_demo.icd
+ */
+
+#ifndef STATIC_MODEL_H_
+#define STATIC_MODEL_H_
+
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+extern LogicalDevice iedModel_PROT;
+extern LogicalNode iedModel_PROT_LLN0;
+extern DataObject iedModel_PROT_LLN0_Mod;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_operTm;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_T;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Test;
+extern DataAttribute iedModel_PROT_LLN0_Mod_Oper_Check;
+extern DataAttribute iedModel_PROT_LLN0_Mod_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Mod_q;
+extern DataAttribute iedModel_PROT_LLN0_Mod_t;
+extern DataAttribute iedModel_PROT_LLN0_Mod_ctlModel;
+extern DataObject iedModel_PROT_LLN0_Beh;
+extern DataAttribute iedModel_PROT_LLN0_Beh_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Beh_q;
+extern DataAttribute iedModel_PROT_LLN0_Beh_t;
+extern DataObject iedModel_PROT_LLN0_Health;
+extern DataAttribute iedModel_PROT_LLN0_Health_stVal;
+extern DataAttribute iedModel_PROT_LLN0_Health_q;
+extern DataAttribute iedModel_PROT_LLN0_Health_t;
+extern DataObject iedModel_PROT_LLN0_NamPlt;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_d;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_PROT_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_PROT_LPHD1;
+extern DataObject iedModel_PROT_LPHD1_PhyNam;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_vendor;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_hwRev;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_swRev;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_serNum;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_model;
+extern DataAttribute iedModel_PROT_LPHD1_PhyNam_location;
+extern DataObject iedModel_PROT_LPHD1_PhyHealth;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_PROT_LPHD1_PhyHealth_t;
+extern DataObject iedModel_PROT_LPHD1_Proxy;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_q;
+extern DataAttribute iedModel_PROT_LPHD1_Proxy_t;
+extern LogicalNode iedModel_PROT_PTOC1;
+extern DataObject iedModel_PROT_PTOC1_Beh;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_stVal;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_q;
+extern DataAttribute iedModel_PROT_PTOC1_Beh_t;
+extern DataObject iedModel_PROT_PTOC1_Mod;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlVal;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_operTm;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orCat;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_ctlNum;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_T;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Test;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_Oper_Check;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_stVal;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_q;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_t;
+extern DataAttribute iedModel_PROT_PTOC1_Mod_ctlModel;
+extern DataObject iedModel_PROT_PTOC1_Str;
+extern DataAttribute iedModel_PROT_PTOC1_Str_general;
+extern DataAttribute iedModel_PROT_PTOC1_Str_dirGeneral;
+extern DataAttribute iedModel_PROT_PTOC1_Str_q;
+extern DataAttribute iedModel_PROT_PTOC1_Str_t;
+extern DataObject iedModel_PROT_PTOC1_Op;
+extern DataAttribute iedModel_PROT_PTOC1_Op_general;
+extern DataAttribute iedModel_PROT_PTOC1_Op_q;
+extern DataAttribute iedModel_PROT_PTOC1_Op_t;
+extern DataObject iedModel_PROT_PTOC1_StrVal;
+extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag;
+extern DataAttribute iedModel_PROT_PTOC1_StrVal_setMag_f;
+extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag;
+extern DataAttribute iedModel_SE_PROT_PTOC1_StrVal_setMag_f;
+extern DataObject iedModel_PROT_PTOC1_OpDlTmms;
+extern DataAttribute iedModel_PROT_PTOC1_OpDlTmms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_OpDlTmms_setVal;
+extern DataObject iedModel_PROT_PTOC1_RsDlTmms;
+extern DataAttribute iedModel_PROT_PTOC1_RsDlTmms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_RsDlTmms_setVal;
+extern DataObject iedModel_PROT_PTOC1_RstTms;
+extern DataAttribute iedModel_PROT_PTOC1_RstTms_setVal;
+extern DataAttribute iedModel_SE_PROT_PTOC1_RstTms_setVal;
+
+
+
+#define IEDMODEL_PROT (&iedModel_PROT)
+#define IEDMODEL_PROT_LLN0 (&iedModel_PROT_LLN0)
+#define IEDMODEL_PROT_LLN0_Mod (&iedModel_PROT_LLN0_Mod)
+#define IEDMODEL_PROT_LLN0_Mod_Oper (&iedModel_PROT_LLN0_Mod_Oper)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_ctlVal (&iedModel_PROT_LLN0_Mod_Oper_ctlVal)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_operTm (&iedModel_PROT_LLN0_Mod_Oper_operTm)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_origin (&iedModel_PROT_LLN0_Mod_Oper_origin)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_origin_orCat (&iedModel_PROT_LLN0_Mod_Oper_origin_orCat)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_origin_orIdent (&iedModel_PROT_LLN0_Mod_Oper_origin_orIdent)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_ctlNum (&iedModel_PROT_LLN0_Mod_Oper_ctlNum)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_T (&iedModel_PROT_LLN0_Mod_Oper_T)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_Test (&iedModel_PROT_LLN0_Mod_Oper_Test)
+#define IEDMODEL_PROT_LLN0_Mod_Oper_Check (&iedModel_PROT_LLN0_Mod_Oper_Check)
+#define IEDMODEL_PROT_LLN0_Mod_stVal (&iedModel_PROT_LLN0_Mod_stVal)
+#define IEDMODEL_PROT_LLN0_Mod_q (&iedModel_PROT_LLN0_Mod_q)
+#define IEDMODEL_PROT_LLN0_Mod_t (&iedModel_PROT_LLN0_Mod_t)
+#define IEDMODEL_PROT_LLN0_Mod_ctlModel (&iedModel_PROT_LLN0_Mod_ctlModel)
+#define IEDMODEL_PROT_LLN0_Beh (&iedModel_PROT_LLN0_Beh)
+#define IEDMODEL_PROT_LLN0_Beh_stVal (&iedModel_PROT_LLN0_Beh_stVal)
+#define IEDMODEL_PROT_LLN0_Beh_q (&iedModel_PROT_LLN0_Beh_q)
+#define IEDMODEL_PROT_LLN0_Beh_t (&iedModel_PROT_LLN0_Beh_t)
+#define IEDMODEL_PROT_LLN0_Health (&iedModel_PROT_LLN0_Health)
+#define IEDMODEL_PROT_LLN0_Health_stVal (&iedModel_PROT_LLN0_Health_stVal)
+#define IEDMODEL_PROT_LLN0_Health_q (&iedModel_PROT_LLN0_Health_q)
+#define IEDMODEL_PROT_LLN0_Health_t (&iedModel_PROT_LLN0_Health_t)
+#define IEDMODEL_PROT_LLN0_NamPlt (&iedModel_PROT_LLN0_NamPlt)
+#define IEDMODEL_PROT_LLN0_NamPlt_vendor (&iedModel_PROT_LLN0_NamPlt_vendor)
+#define IEDMODEL_PROT_LLN0_NamPlt_swRev (&iedModel_PROT_LLN0_NamPlt_swRev)
+#define IEDMODEL_PROT_LLN0_NamPlt_d (&iedModel_PROT_LLN0_NamPlt_d)
+#define IEDMODEL_PROT_LLN0_NamPlt_configRev (&iedModel_PROT_LLN0_NamPlt_configRev)
+#define IEDMODEL_PROT_LLN0_NamPlt_ldNs (&iedModel_PROT_LLN0_NamPlt_ldNs)
+#define IEDMODEL_PROT_LPHD1 (&iedModel_PROT_LPHD1)
+#define IEDMODEL_PROT_LPHD1_PhyNam (&iedModel_PROT_LPHD1_PhyNam)
+#define IEDMODEL_PROT_LPHD1_PhyNam_vendor (&iedModel_PROT_LPHD1_PhyNam_vendor)
+#define IEDMODEL_PROT_LPHD1_PhyNam_hwRev (&iedModel_PROT_LPHD1_PhyNam_hwRev)
+#define IEDMODEL_PROT_LPHD1_PhyNam_swRev (&iedModel_PROT_LPHD1_PhyNam_swRev)
+#define IEDMODEL_PROT_LPHD1_PhyNam_serNum (&iedModel_PROT_LPHD1_PhyNam_serNum)
+#define IEDMODEL_PROT_LPHD1_PhyNam_model (&iedModel_PROT_LPHD1_PhyNam_model)
+#define IEDMODEL_PROT_LPHD1_PhyNam_location (&iedModel_PROT_LPHD1_PhyNam_location)
+#define IEDMODEL_PROT_LPHD1_PhyHealth (&iedModel_PROT_LPHD1_PhyHealth)
+#define IEDMODEL_PROT_LPHD1_PhyHealth_stVal (&iedModel_PROT_LPHD1_PhyHealth_stVal)
+#define IEDMODEL_PROT_LPHD1_PhyHealth_q (&iedModel_PROT_LPHD1_PhyHealth_q)
+#define IEDMODEL_PROT_LPHD1_PhyHealth_t (&iedModel_PROT_LPHD1_PhyHealth_t)
+#define IEDMODEL_PROT_LPHD1_Proxy (&iedModel_PROT_LPHD1_Proxy)
+#define IEDMODEL_PROT_LPHD1_Proxy_stVal (&iedModel_PROT_LPHD1_Proxy_stVal)
+#define IEDMODEL_PROT_LPHD1_Proxy_q (&iedModel_PROT_LPHD1_Proxy_q)
+#define IEDMODEL_PROT_LPHD1_Proxy_t (&iedModel_PROT_LPHD1_Proxy_t)
+#define IEDMODEL_PROT_PTOC1 (&iedModel_PROT_PTOC1)
+#define IEDMODEL_PROT_PTOC1_Beh (&iedModel_PROT_PTOC1_Beh)
+#define IEDMODEL_PROT_PTOC1_Beh_stVal (&iedModel_PROT_PTOC1_Beh_stVal)
+#define IEDMODEL_PROT_PTOC1_Beh_q (&iedModel_PROT_PTOC1_Beh_q)
+#define IEDMODEL_PROT_PTOC1_Beh_t (&iedModel_PROT_PTOC1_Beh_t)
+#define IEDMODEL_PROT_PTOC1_Mod (&iedModel_PROT_PTOC1_Mod)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper (&iedModel_PROT_PTOC1_Mod_Oper)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_ctlVal (&iedModel_PROT_PTOC1_Mod_Oper_ctlVal)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_operTm (&iedModel_PROT_PTOC1_Mod_Oper_operTm)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_origin (&iedModel_PROT_PTOC1_Mod_Oper_origin)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_origin_orCat (&iedModel_PROT_PTOC1_Mod_Oper_origin_orCat)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_origin_orIdent (&iedModel_PROT_PTOC1_Mod_Oper_origin_orIdent)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_ctlNum (&iedModel_PROT_PTOC1_Mod_Oper_ctlNum)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_T (&iedModel_PROT_PTOC1_Mod_Oper_T)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_Test (&iedModel_PROT_PTOC1_Mod_Oper_Test)
+#define IEDMODEL_PROT_PTOC1_Mod_Oper_Check (&iedModel_PROT_PTOC1_Mod_Oper_Check)
+#define IEDMODEL_PROT_PTOC1_Mod_stVal (&iedModel_PROT_PTOC1_Mod_stVal)
+#define IEDMODEL_PROT_PTOC1_Mod_q (&iedModel_PROT_PTOC1_Mod_q)
+#define IEDMODEL_PROT_PTOC1_Mod_t (&iedModel_PROT_PTOC1_Mod_t)
+#define IEDMODEL_PROT_PTOC1_Mod_ctlModel (&iedModel_PROT_PTOC1_Mod_ctlModel)
+#define IEDMODEL_PROT_PTOC1_Str (&iedModel_PROT_PTOC1_Str)
+#define IEDMODEL_PROT_PTOC1_Str_general (&iedModel_PROT_PTOC1_Str_general)
+#define IEDMODEL_PROT_PTOC1_Str_dirGeneral (&iedModel_PROT_PTOC1_Str_dirGeneral)
+#define IEDMODEL_PROT_PTOC1_Str_q (&iedModel_PROT_PTOC1_Str_q)
+#define IEDMODEL_PROT_PTOC1_Str_t (&iedModel_PROT_PTOC1_Str_t)
+#define IEDMODEL_PROT_PTOC1_Op (&iedModel_PROT_PTOC1_Op)
+#define IEDMODEL_PROT_PTOC1_Op_general (&iedModel_PROT_PTOC1_Op_general)
+#define IEDMODEL_PROT_PTOC1_Op_q (&iedModel_PROT_PTOC1_Op_q)
+#define IEDMODEL_PROT_PTOC1_Op_t (&iedModel_PROT_PTOC1_Op_t)
+#define IEDMODEL_PROT_PTOC1_StrVal (&iedModel_PROT_PTOC1_StrVal)
+#define IEDMODEL_PROT_PTOC1_StrVal_setMag (&iedModel_PROT_PTOC1_StrVal_setMag)
+#define IEDMODEL_PROT_PTOC1_StrVal_setMag_f (&iedModel_PROT_PTOC1_StrVal_setMag_f)
+#define IEDMODEL_SE_PROT_PTOC1_StrVal_setMag (&iedModel_SE_PROT_PTOC1_StrVal_setMag)
+#define IEDMODEL_SE_PROT_PTOC1_StrVal_setMag_f (&iedModel_SE_PROT_PTOC1_StrVal_setMag_f)
+#define IEDMODEL_PROT_PTOC1_OpDlTmms (&iedModel_PROT_PTOC1_OpDlTmms)
+#define IEDMODEL_PROT_PTOC1_OpDlTmms_setVal (&iedModel_PROT_PTOC1_OpDlTmms_setVal)
+#define IEDMODEL_SE_PROT_PTOC1_OpDlTmms_setVal (&iedModel_SE_PROT_PTOC1_OpDlTmms_setVal)
+#define IEDMODEL_PROT_PTOC1_RsDlTmms (&iedModel_PROT_PTOC1_RsDlTmms)
+#define IEDMODEL_PROT_PTOC1_RsDlTmms_setVal (&iedModel_PROT_PTOC1_RsDlTmms_setVal)
+#define IEDMODEL_SE_PROT_PTOC1_RsDlTmms_setVal (&iedModel_SE_PROT_PTOC1_RsDlTmms_setVal)
+#define IEDMODEL_PROT_PTOC1_RstTms (&iedModel_PROT_PTOC1_RstTms)
+#define IEDMODEL_PROT_PTOC1_RstTms_setVal (&iedModel_PROT_PTOC1_RstTms_setVal)
+#define IEDMODEL_SE_PROT_PTOC1_RstTms_setVal (&iedModel_SE_PROT_PTOC1_RstTms_setVal)
+
+#endif /* STATIC_MODEL_H_ */
+
diff --git a/examples/server_example_threadless/CMakeLists.txt b/examples/server_example_threadless/CMakeLists.txt
new file mode 100644
index 0000000..388f715
--- /dev/null
+++ b/examples/server_example_threadless/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ .
+)
+
+set(server_example_threadless_SRCS
+ server_example_threadless.c
+ static_model.c
+)
+
+IF(WIN32)
+set_source_files_properties(${server_example_threadless_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ENDIF(WIN32)
+
+add_executable(server_example_threadless
+ ${server_example_threadless_SRCS}
+)
+
+target_link_libraries(server_example_threadless
+ iec61850
+)
diff --git a/examples/server_example_threadless/Makefile b/examples/server_example_threadless/Makefile
new file mode 100644
index 0000000..c0490fd
--- /dev/null
+++ b/examples/server_example_threadless/Makefile
@@ -0,0 +1,31 @@
+LIBIEC_HOME=../..
+
+PROJECT_BINARY_NAME = server_example_threadless
+PROJECT_SOURCES = server_example_threadless.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_threadless/server_example_threadless.c b/examples/server_example_threadless/server_example_threadless.c
new file mode 100644
index 0000000..7f1f5c8
--- /dev/null
+++ b/examples/server_example_threadless/server_example_threadless.c
@@ -0,0 +1,153 @@
+/*
+ * server_example_single_threaded.c
+ *
+ * - How to use the single-threaded execution model
+ */
+
+#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;
+}
+
+ControlHandlerResult
+controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test)
+{
+
+ 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;
+}
+
+int
+main(int argc, char** argv)
+{
+
+ iedServer = IedServer_create(&iedModel);
+
+ /* 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);
+
+ /* MMS server will be instructed to start listening to client connections. */
+ IedServer_startThreadless(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;
+
+ uint64_t lastTimestamp = Hal_getTimeInMs();
+
+ while (running) {
+ uint64_t timestamp = Hal_getTimeInMs();
+
+ if (timestamp - lastTimestamp >= 100) {
+
+ 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);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, timestamp);
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, timestamp);
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, timestamp);
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);
+
+ IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, timestamp);
+ IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);
+
+ IedServer_unlockDataModel(iedServer);
+
+ lastTimestamp = timestamp;
+ }
+
+ /* Has to be called whenever the TCP stack receives data */
+ IedServer_processIncomingData(iedServer);
+
+ /* Has to be called periodically */
+ IedServer_performPeriodicTasks(iedServer);
+
+ Thread_sleep(1);
+ }
+
+ /* stop MMS server - close TCP server socket and all client sockets */
+ IedServer_stopThreadless(iedServer);
+
+ /* Cleanup - free all resources */
+ IedServer_destroy(iedServer);
+} /* main() */
diff --git a/examples/server_example_threadless/simpleIO_direct_control.icd b/examples/server_example_threadless/simpleIO_direct_control.icd
new file mode 100644
index 0000000..d17242c
--- /dev/null
+++ b/examples/server_example_threadless/simpleIO_direct_control.icd
@@ -0,0 +1,255 @@
+
+
+
+
+
+ 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_threadless/static_model.c b/examples/server_example_threadless/static_model.c
new file mode 100644
index 0000000..10cab57
--- /dev/null
+++ b/examples/server_example_threadless/static_model.c
@@ -0,0 +1,2028 @@
+/*
+ * static_model.c
+ *
+ * automatically generated from simpleIO_direct_control.icd
+ */
+#include
+#include "iec61850_model.h"
+
+extern IedModel iedModel;
+static void initializeValues();
+extern LogicalDevice iedModel_GenericIO;
+extern LogicalNode iedModel_GenericIO_LLN0;
+extern DataObject iedModel_GenericIO_LLN0_Mod;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_t;
+extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_LLN0_Beh;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Beh_t;
+extern DataObject iedModel_GenericIO_LLN0_Health;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_q;
+extern DataAttribute iedModel_GenericIO_LLN0_Health_t;
+extern DataObject iedModel_GenericIO_LLN0_NamPlt;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev;
+extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs;
+extern LogicalNode iedModel_GenericIO_LPHD1;
+extern DataObject iedModel_GenericIO_LPHD1_PhyNam;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor;
+extern DataObject iedModel_GenericIO_LPHD1_PhyHealth;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t;
+extern DataObject iedModel_GenericIO_LPHD1_Proxy;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q;
+extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t;
+extern LogicalNode iedModel_GenericIO_GGIO1;
+extern DataObject iedModel_GenericIO_GGIO1_Mod;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t;
+extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel;
+extern DataObject iedModel_GenericIO_GGIO1_Beh;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t;
+extern DataObject iedModel_GenericIO_GGIO1_Health;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Health_t;
+extern DataObject iedModel_GenericIO_GGIO1_NamPlt;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev;
+extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn1;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn2;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn3;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t;
+extern DataObject iedModel_GenericIO_GGIO1_AnIn4;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO1;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
+extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
+extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind1;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind2;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind3;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t;
+extern DataObject iedModel_GenericIO_GGIO1_Ind4;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
+extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
+
+extern DataSet ds_GenericIO_LLN0_Events;
+extern DataSet ds_GenericIO_LLN0_Events2;
+
+
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2;
+extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3;
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO1$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda1
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO2$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda2
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO3$stVal",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events_fcda3
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO4$stVal",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_GenericIO_LLN0_Events = {
+ "GenericIO",
+ "LLN0$Events",
+ 4,
+ &ds_GenericIO_LLN0_Events_fcda0,
+ &ds_GenericIO_LLN0_Events2
+};
+
+extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda0;
+extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda1;
+extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda2;
+extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda3;
+
+DataSetEntry ds_GenericIO_LLN0_Events2_fcda0 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO1",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events2_fcda1
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events2_fcda1 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO2",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events2_fcda2
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events2_fcda2 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO3",
+ -1,
+ NULL,
+ NULL,
+ &ds_GenericIO_LLN0_Events2_fcda3
+};
+
+DataSetEntry ds_GenericIO_LLN0_Events2_fcda3 = {
+ "GenericIO",
+ false,
+ "GGIO1$ST$SPCSO4",
+ -1,
+ NULL,
+ NULL,
+ NULL
+};
+
+DataSet ds_GenericIO_LLN0_Events2 = {
+ "GenericIO",
+ "LLN0$Events2",
+ 4,
+ &ds_GenericIO_LLN0_Events2_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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_LLN0_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ TIMESTAMP,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = {
+ DataAttributeModelType,
+ "ctlModel",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_CF,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ENUMERATED,
+ 0,
+ NULL,
+ 0};
+
+DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
+ DataAttributeModelType,
+ "t",
+ (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
+ NULL,
+ NULL,
+ 0,
+ IEC61850_FC_ST,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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;
+
+ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1};
+ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2};
+ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 8, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3};
+ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 8, 111, 50, 1000, NULL};
+
+
+
+
+IedModel iedModel = {
+ "simpleIO",
+ &iedModel_GenericIO,
+ &ds_GenericIO_LLN0_Events,
+ &iedModel_GenericIO_LLN0_report0,
+ NULL,
+ NULL,
+ 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_threadless/static_model.h b/examples/server_example_threadless/static_model.h
new file mode 100644
index 0000000..b5670e9
--- /dev/null
+++ b/examples/server_example_threadless/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_threadless/vmd-filestore/SYSTEM.BIN b/examples/server_example_threadless/vmd-filestore/SYSTEM.BIN
new file mode 100644
index 0000000..e69de29
diff --git a/make/common_targets.mk b/make/common_targets.mk
new file mode 100644
index 0000000..6e5fb1f
--- /dev/null
+++ b/make/common_targets.mk
@@ -0,0 +1,7 @@
+$(LIB_NAME):
+ cd $(LIBIEC_HOME); $(MAKE) -f Makefile
+
+lib: $(LIB_NAME)
+
+libclean: clean
+ cd $(LIBIEC_HOME); $(MAKE) -f Makefile clean
diff --git a/make/stack_includes.mk b/make/stack_includes.mk
new file mode 100644
index 0000000..28e1291
--- /dev/null
+++ b/make/stack_includes.mk
@@ -0,0 +1,9 @@
+INCLUDES = -I$(LIBIEC_HOME)/config
+INCLUDES += -I$(LIBIEC_HOME)/src/common/inc
+INCLUDES += -I$(LIBIEC_HOME)/src/mms/inc
+INCLUDES += -I$(LIBIEC_HOME)/src/mms/inc_private
+INCLUDES += -I$(LIBIEC_HOME)/src/mms/asn1
+INCLUDES += -I$(LIBIEC_HOME)/src/iec61850/inc
+INCLUDES += -I$(LIBIEC_HOME)/src/iec61850/inc_private
+INCLUDES += -I$(LIBIEC_HOME)/src/hal/inc
+INCLUDES += -I$(LIBIEC_HOME)/src/goose
diff --git a/make/target_system.mk b/make/target_system.mk
new file mode 100644
index 0000000..c7edf35
--- /dev/null
+++ b/make/target_system.mk
@@ -0,0 +1,169 @@
+UNAME := $(shell uname)
+
+MIPSEL_TOOLCHAIN_PREFIX=mipsel-openwrt-linux-
+# ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabihf-
+#ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi-
+#ARM_TOOLCHAIN_PREFIX=arm-poky-linux-gnueabi-
+ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi-
+UCLINUX_ARM_TOOLCHAIN_PREFIX=arm-uclinux-elf-
+MINGW_TOOLCHAIN_PREFIX=i586-mingw32msvc-
+#MINGW_TOOLCHAIN_PREFIX=x86_64-w64-mingw32-
+MINGW64_TOOLCHAIN_PREFIX=x86_64-w64-mingw32-
+
+#POWERPC_TOOLCHAIN_PREFIX=powerpc-poky-linux-
+POWERPC_TOOLCHAIN_PREFIX=powerpc-linux-gnu-
+
+ifndef TARGET
+ifeq ($(UNAME), Linux)
+TARGET=POSIX
+else ifeq ($(findstring MINGW,$(UNAME)), MINGW)
+TARGET=WIN32
+else ifeq ($(UNAME), Darwin)
+TARGET=BSD
+else ifeq ($(UNAME), FreeBSD)
+TARGET=BSD
+endif
+endif
+
+ifeq ($(TARGET), WIN32)
+WINDOWS=1
+endif
+
+ifeq ($(TARGET), WIN64)
+WINDOWS=1
+endif
+
+ifdef WINDOWS
+ifeq ($(UNAME), Linux)
+ifeq ($(TARGET), WIN32)
+TOOLCHAIN_PREFIX=$(MINGW_TOOLCHAIN_PREFIX)
+endif
+ifeq ($(TARGET), WIN64)
+TOOLCHAIN_PREFIX=$(MINGW64_TOOLCHAIN_PREFIX)
+endif
+else
+TOOLCHAIN_PREFIX=
+endif
+endif
+
+ifeq ($(TARGET), LINUX-POWERPC)
+TOOLCHAIN_PREFIX=$(POWERPC_TOOLCHAIN_PREFIX)
+endif
+
+ifeq ($(TARGET), LINUX-MIPSEL)
+TOOLCHAIN_PREFIX=$(MIPSEL_TOOLCHAIN_PREFIX)
+endif
+
+ifeq ($(TARGET), LINUX-ARM)
+TOOLCHAIN_PREFIX=$(ARM_TOOLCHAIN_PREFIX)
+endif
+
+ifeq ($(TARGET), UCLINUX-WAGO)
+TOOLCHAIN_PREFIX=$(UCLINUX_ARM_TOOLCHAIN_PREFIX)
+CFLAGS += -msoft-float
+CFLAGS += -Wall
+CFLAGS += -DEMBED
+CFLAGS += -Dlinux -D__linux__ -Dunix
+CFLAGS += -D__uClinux__
+CFLAGS += -DTARGET=UCLINUX-WAGO
+LDFLAGS += -Wl,-move-rodata -Wl,-elf2flt
+endif
+
+ifdef WINDOWS
+HAL_IMPL = WIN32
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build_win32
+CFLAGS=-g -DWIN32
+
+ifeq ($(TARGET), WIN32)
+CFLAGS+=-m32
+endif
+
+ifeq ($(TARGET), WIN64)
+CFLAGS+=-m64
+endif
+
+LDLIBS=-lws2_32
+DYNLIB_LDFLAGS=-Wl,-no-undefined -Wl,--enable-runtime-pseudo-reloc -Wl,--output-def,libiec61850.def,--out-implib,libiec61850.a
+
+
+# on Windows: only compile with ethernet support if winpcap files are in third_party/winpcap!
+ifneq (, $(wildcard $(LIBIEC_HOME)/third_party/winpcap/Include/.))
+
+ifeq ($(TARGET), WIN64)
+LDFLAGS += -L$(LIBIEC_HOME)/third_party/winpcap/Lib/x64
+else
+LDFLAGS += -L$(LIBIEC_HOME)/third_party/winpcap/Lib
+endif
+
+LDLIBS+=-liphlpapi -lwpcap
+else
+$(warning winpcap not found - will build without GOOSE support!)
+CFLAGS += -DEXCLUDE_ETHERNET_WINDOWS
+EXCLUDE_ETHERNET_WINDOWS = 1
+endif
+
+
+else
+ifeq ($(TARGET), BSD)
+HAL_IMPL = BSD
+else
+HAL_IMPL = POSIX
+endif
+
+LDLIBS = -lpthread
+
+ifeq ($(TARGET), LINUX-MIPSEL)
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build-mipsel
+else ifeq ($(TARGET), LINUX-ARM)
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build-arm
+else ifeq ($(TARGET), UCLINUX-WAGO)
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build-wago
+CFLAGS += -DTARGET_SYSTEM_UCLINUX_WAGO
+else ifeq ($(TARGET), LINUX-POWERPC)
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build-powerpc
+else
+LIB_OBJS_DIR = $(LIBIEC_HOME)/build
+endif
+
+CFLAGS += -g
+#CFLAGS += -Os
+
+DYNLIB_LDFLAGS=-lpthread
+endif
+
+ifneq ($(TARGET), CLANG-CHECK)
+CC=$(TOOLCHAIN_PREFIX)gcc
+CPP=$(TOOLCHAIN_PREFIX)g++
+endif
+
+ifeq ($(TARGET), BSD)
+CC=cc
+CPP=c++
+endif
+
+AR=$(TOOLCHAIN_PREFIX)ar
+RANLIB=$(TOOLCHAIN_PREFIX)ranlib
+
+
+ifeq ($(TARGET), WIN32)
+PROJECT_BINARY_NAME := $(PROJECT_BINARY_NAME).exe
+endif
+
+LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.a
+
+ifeq ($(TARGET), BSD)
+CFLAGS += -arch i386
+LDFLAGS += -arch i386
+endif
+
+ifeq ($(TARGET), WIN32)
+DYN_LIB_NAME = $(LIB_OBJS_DIR)/iec61850.dll
+else
+
+ifeq ($(TARGET), BSD)
+DYN_LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.dylib
+else
+DYN_LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.so
+endif
+
+endif
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..46dbfae
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,337 @@
+
+set (lib_common_SRCS
+./common/string_map.c
+./common/array_list.c
+./common/map.c
+./common/linked_list.c
+./common/byte_buffer.c
+./common/lib_memory.c
+./common/string_utilities.c
+./common/buffer_chain.c
+./common/conversions.c
+./common/mem_alloc_linked_list.c
+./common/simple_allocator.c
+./mms/iso_server/iso_connection.c
+./mms/iso_server/iso_server.c
+./mms/iso_acse/acse.c
+./mms/iso_mms/common/mms_type_spec.c
+./mms/iso_mms/common/mms_value.c
+./mms/iso_mms/common/mms_common_msg.c
+./mms/iso_mms/client/mms_client_initiate.c
+./mms/iso_mms/client/mms_client_write.c
+./mms/iso_mms/client/mms_client_identify.c
+./mms/iso_mms/client/mms_client_status.c
+./mms/iso_mms/client/mms_client_named_variable_list.c
+./mms/iso_mms/client/mms_client_connection.c
+./mms/iso_mms/client/mms_client_files.c
+./mms/iso_mms/client/mms_client_get_namelist.c
+./mms/iso_mms/client/mms_client_get_var_access.c
+./mms/iso_mms/client/mms_client_common.c
+./mms/iso_mms/client/mms_client_read.c
+./mms/iso_mms/server/mms_read_service.c
+./mms/iso_mms/server/mms_file_service.c
+./mms/iso_mms/server/mms_association_service.c
+./mms/iso_mms/server/mms_identify_service.c
+./mms/iso_mms/server/mms_status_service.c
+./mms/iso_mms/server/mms_named_variable_list_service.c
+./mms/iso_mms/server/mms_value_cache.c
+./mms/iso_mms/server/mms_get_namelist_service.c
+./mms/iso_mms/server/mms_access_result.c
+./mms/iso_mms/server/mms_server.c
+./mms/iso_mms/server/mms_server_common.c
+./mms/iso_mms/server/mms_named_variable_list.c
+./mms/iso_mms/server/mms_domain.c
+./mms/iso_mms/server/mms_device.c
+./mms/iso_mms/server/mms_information_report.c
+./mms/iso_mms/server/mms_server_connection.c
+./mms/iso_mms/server/mms_write_service.c
+./mms/iso_mms/server/mms_get_var_access_service.c
+./mms/iso_cotp/cotp.c
+./mms/iso_presentation/iso_presentation.c
+./mms/asn1/ber_decode.c
+./mms/asn1/asn1_ber_primitive_value.c
+./mms/asn1/ber_encoder.c
+./mms/asn1/ber_integer.c
+./mms/iso_client/iso_client_connection.c
+./mms/iso_common/iso_connection_parameters.c
+./mms/iso_session/iso_session.c
+./iec61850/client/client_control.c
+./iec61850/client/client_report_control.c
+./iec61850/client/client_goose_control.c
+./iec61850/client/client_report.c
+./iec61850/client/ied_connection.c
+./iec61850/common/iec61850_common.c
+./iec61850/server/impl/ied_server.c
+./iec61850/server/impl/client_connection.c
+./iec61850/server/model/model.c
+./iec61850/server/model/dynamic_model.c
+./iec61850/server/model/cdc.c
+./iec61850/server/model/config_file_parser.c
+./iec61850/server/mms_mapping/control.c
+./iec61850/server/mms_mapping/mms_mapping.c
+./iec61850/server/mms_mapping/reporting.c
+./iec61850/server/mms_mapping/mms_goose.c
+
+)
+
+set (lib_asn1c_SRCS
+./mms/iso_mms/asn1c/DataAccessError.c
+./mms/iso_mms/asn1c/DeleteNamedVariableListRequest.c
+./mms/iso_mms/asn1c/constr_SET_OF.c
+./mms/iso_mms/asn1c/MmsPdu.c
+./mms/iso_mms/asn1c/GetNamedVariableListAttributesResponse.c
+./mms/iso_mms/asn1c/BIT_STRING.c
+./mms/iso_mms/asn1c/ber_tlv_tag.c
+./mms/iso_mms/asn1c/constr_SEQUENCE_OF.c
+./mms/iso_mms/asn1c/asn_SET_OF.c
+./mms/iso_mms/asn1c/ReadResponse.c
+./mms/iso_mms/asn1c/InformationReport.c
+./mms/iso_mms/asn1c/ConfirmedServiceRequest.c
+./mms/iso_mms/asn1c/DeleteNamedVariableListResponse.c
+./mms/iso_mms/asn1c/asn_SEQUENCE_OF.c
+./mms/iso_mms/asn1c/VariableAccessSpecification.c
+./mms/iso_mms/asn1c/GetVariableAccessAttributesRequest.c
+./mms/iso_mms/asn1c/xer_support.c
+./mms/iso_mms/asn1c/ObjectName.c
+./mms/iso_mms/asn1c/NativeEnumerated.c
+./mms/iso_mms/asn1c/per_encoder.c
+./mms/iso_mms/asn1c/constr_SEQUENCE.c
+./mms/iso_mms/asn1c/GetNameListResponse.c
+./mms/iso_mms/asn1c/MMSString.c
+./mms/iso_mms/asn1c/InitiateErrorPdu.c
+./mms/iso_mms/asn1c/IndexRangeSeq.c
+./mms/iso_mms/asn1c/ConfirmedErrorPDU.c
+./mms/iso_mms/asn1c/UnconfirmedService.c
+./mms/iso_mms/asn1c/UTF8String.c
+./mms/iso_mms/asn1c/ServiceError.c
+./mms/iso_mms/asn1c/TimeOfDay.c
+./mms/iso_mms/asn1c/GetNameListRequest.c
+./mms/iso_mms/asn1c/asn_codecs_prim.c
+./mms/iso_mms/asn1c/Data.c
+./mms/iso_mms/asn1c/ScatteredAccessDescription.c
+./mms/iso_mms/asn1c/ReadRequest.c
+./mms/iso_mms/asn1c/per_decoder.c
+./mms/iso_mms/asn1c/Identifier.c
+./mms/iso_mms/asn1c/ServiceSupportOptions.c
+./mms/iso_mms/asn1c/Integer8.c
+./mms/iso_mms/asn1c/ConfirmedServiceResponse.c
+./mms/iso_mms/asn1c/ParameterSupportOptions.c
+./mms/iso_mms/asn1c/Integer16.c
+./mms/iso_mms/asn1c/ber_tlv_length.c
+./mms/iso_mms/asn1c/OCTET_STRING.c
+./mms/iso_mms/asn1c/DefineNamedVariableListRequest.c
+./mms/iso_mms/asn1c/FloatingPoint.c
+./mms/iso_mms/asn1c/xer_encoder.c
+./mms/iso_mms/asn1c/Unsigned8.c
+./mms/iso_mms/asn1c/BOOLEAN.c
+./mms/iso_mms/asn1c/INTEGER.c
+./mms/iso_mms/asn1c/UnconfirmedPDU.c
+./mms/iso_mms/asn1c/DataSequence.c
+./mms/iso_mms/asn1c/constraints.c
+./mms/iso_mms/asn1c/der_encoder.c
+./mms/iso_mms/asn1c/VisibleString.c
+./mms/iso_mms/asn1c/InitiateResponsePdu.c
+./mms/iso_mms/asn1c/StructComponent.c
+./mms/iso_mms/asn1c/Address.c
+./mms/iso_mms/asn1c/Unsigned16.c
+./mms/iso_mms/asn1c/ber_decoder.c
+./mms/iso_mms/asn1c/per_support.c
+./mms/iso_mms/asn1c/WriteResponse.c
+./mms/iso_mms/asn1c/InitRequestDetail.c
+./mms/iso_mms/asn1c/InitiateRequestPdu.c
+./mms/iso_mms/asn1c/DefineNamedVariableListResponse.c
+./mms/iso_mms/asn1c/NULL.c
+./mms/iso_mms/asn1c/ListOfVariableSeq.c
+./mms/iso_mms/asn1c/UtcTime.c
+./mms/iso_mms/asn1c/ConcludeResponsePDU.c
+./mms/iso_mms/asn1c/AccessResult.c
+./mms/iso_mms/asn1c/Integer32.c
+./mms/iso_mms/asn1c/GetNamedVariableListAttributesRequest.c
+./mms/iso_mms/asn1c/VariableSpecification.c
+./mms/iso_mms/asn1c/Unsigned32.c
+./mms/iso_mms/asn1c/constr_CHOICE.c
+./mms/iso_mms/asn1c/AlternateAccess.c
+./mms/iso_mms/asn1c/ObjectClass.c
+./mms/iso_mms/asn1c/InitResponseDetail.c
+./mms/iso_mms/asn1c/ConfirmedResponsePdu.c
+./mms/iso_mms/asn1c/GetVariableAccessAttributesResponse.c
+./mms/iso_mms/asn1c/NativeInteger.c
+./mms/iso_mms/asn1c/xer_decoder.c
+./mms/iso_mms/asn1c/AlternateAccessSelection.c
+./mms/iso_mms/asn1c/ConfirmedRequestPdu.c
+./mms/iso_mms/asn1c/ConcludeRequestPDU.c
+./mms/iso_mms/asn1c/WriteRequest.c
+./mms/iso_mms/asn1c/RejectPDU.c
+./mms/iso_mms/asn1c/TypeSpecification.c
+./mms/iso_mms/asn1c/constr_TYPE.c
+./mms/iso_mms/asn1c/GeneralizedTime.c
+)
+
+set (lib_goose_SRCS
+./goose/goose_subscriber.c
+./goose/goose_receiver.c
+./goose/goose_publisher.c
+)
+
+set (lib_linux_SRCS
+./hal/socket/linux/socket_linux.c
+./hal/ethernet/linux/ethernet_linux.c
+./hal/thread/linux/thread_linux.c
+./hal/filesystem/linux/file_provider_linux.c
+./hal/time/unix/time.c
+)
+
+set (lib_windows_SRCS
+./hal/socket/win32/socket_win32.c
+./hal/ethernet/win32/ethernet_win32.c
+./hal/thread/win32/thread_win32.c
+./hal/filesystem/win32/file_provider_win32.c
+./hal/time/win32/time.c
+)
+
+set (lib_bsd_SRCS
+./hal/socket/bsd/socket_bsd.c
+./hal/ethernet/bsd/ethernet_bsd.c
+./hal/thread/linux/thread_linux.c
+./hal/filesystem/linux/file_provider_linux.c
+./hal/time/unix/time.c
+)
+
+IF(WIN32)
+
+if(EXISTS "../third_party/winpcap/Lib/wpcap.lib")
+message("Found winpcap -> can compile with GOOSE support")
+set(WITH_WPCAP 1)
+endif()
+
+set_source_files_properties(${lib_asn1c_SRCS}
+ PROPERTIES LANGUAGE C)
+
+set_source_files_properties(${lib_common_SRCS} ${lib_windows_SRCS}
+ PROPERTIES LANGUAGE CXX)
+
+IF(WITH_WPCAP)
+set_source_files_properties(${lib_goose_SRCS}
+ PROPERTIES LANGUAGE CXX)
+ELSE()
+add_definitions(-DEXCLUDE_ETHERNET_WINDOWS)
+ENDIF()
+
+set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}\"/DEF:${CMAKE_CURRENT_SOURCE_DIR}/vs/libiec61850.def\"")
+
+include_directories(
+ ../third_party/winpcap/include
+)
+
+IF(WITH_WPCAP)
+set (library_SRCS
+ ${lib_common_SRCS}
+ ${lib_asn1c_SRCS}
+ ${lib_goose_SRCS}
+ ${lib_windows_SRCS}
+)
+
+ELSE()
+set (library_SRCS
+ ${lib_common_SRCS}
+ ${lib_asn1c_SRCS}
+ ${lib_windows_SRCS}
+)
+
+ENDIF(WITH_WPCAP)
+
+ELSEIF(UNIX)
+IF(APPLE)
+set (library_SRCS
+ ${lib_common_SRCS}
+ ${lib_asn1c_SRCS}
+ ${lib_goose_SRCS}
+ ${lib_bsd_SRCS}
+)
+ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+set (library_SRCS
+ ${lib_common_SRCS}
+ ${lib_asn1c_SRCS}
+ ${lib_goose_SRCS}
+ ${lib_bsd_SRCS}
+)
+ELSE()
+set (library_SRCS
+ ${lib_common_SRCS}
+ ${lib_asn1c_SRCS}
+ ${lib_goose_SRCS}
+ ${lib_linux_SRCS}
+)
+ENDIF(APPLE)
+ENDIF(WIN32)
+
+
+include (GenerateExportHeader)
+
+add_library (iec61850-shared SHARED ${library_SRCS} )
+
+set_target_properties(iec61850-shared PROPERTIES
+ OUTPUT_NAME iec61850
+ SOVERSION "${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${LIB_VERSION_PATCH}"
+)
+
+
+GENERATE_EXPORT_HEADER(iec61850-shared
+ BASE_NAME iec61850-shared
+ EXPORT_MACRO_NAME iec61850-shared_EXPORT
+ EXPORT_FILE_NAME iec61850-shared_export.h
+ STATIC_DEFINE iec61850-shared_BUILT_AS_STATIC
+)
+
+add_library (iec61850 STATIC ${library_SRCS})
+
+IF(UNIX)
+ IF (CONFIG_SYSTEM_HAS_CLOCK_GETTIME)
+ target_link_libraries (iec61850
+ -lpthread
+ -lm
+ -lrt
+ )
+ ELSE ()
+ target_link_libraries (iec61850
+ -lpthread
+ -lm
+ )
+ ENDIF (CONFIG_SYSTEM_HAS_CLOCK_GETTIME)
+ENDIF(UNIX)
+
+
+iF(WITH_WPCAP)
+target_link_libraries(iec61850
+ ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/lib/wpcap.lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/lib/packet.lib
+)
+target_link_libraries(iec61850-shared
+ ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/lib/wpcap.lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/lib/packet.lib
+)
+
+
+if(MSVC)
+ set_target_properties(iec61850-shared PROPERTIES
+ LINK_FLAGS "/DEF:\"${CMAKE_CURRENT_SOURCE_DIR}/vs/libiec61850.def\""
+ )
+endif()
+
+
+ELSE(WITH_WPCAP)
+if(MSVC)
+ set_target_properties(iec61850-shared PROPERTIES
+ LINK_FLAGS "/DEF:\"${CMAKE_CURRENT_SOURCE_DIR}/vs/libiec61850-wo-goose.def\""
+ )
+endif()
+ENDIF(WITH_WPCAP)
+
+
+
+install (TARGETS iec61850 iec61850-shared
+ RUNTIME DESTINATION bin
+ ARCHIVE DESTINATION lib
+ LIBRARY DESTINATION lib
+)
+
diff --git a/src/common/array_list.c b/src/common/array_list.c
new file mode 100644
index 0000000..ba9eb96
--- /dev/null
+++ b/src/common/array_list.c
@@ -0,0 +1,35 @@
+/*
+ * array_list.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 "libiec61850_platform_includes.h"
+#include "array_list.h"
+
+int
+ArrayList_listSize(void** list)
+{
+ int size = 0;
+
+ while (list[size] != NULL)
+ size++;
+ return size;
+}
diff --git a/src/common/buffer_chain.c b/src/common/buffer_chain.c
new file mode 100644
index 0000000..9604314
--- /dev/null
+++ b/src/common/buffer_chain.c
@@ -0,0 +1,93 @@
+/*
+ * buffer_chain.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 "libiec61850_platform_includes.h"
+
+#include "buffer_chain.h"
+
+void
+BufferChain_init(BufferChain self, int length, int partLength, BufferChain nextPart, uint8_t* buffer)
+{
+ self->length = length;
+ self->partLength = partLength;
+ self->partMaxLength = partLength;
+ self->nextPart = nextPart;
+ self->buffer = buffer;
+}
+
+void
+BufferChain_destroy(BufferChain self)
+{
+ BufferChain currentChainElement = self;
+
+ while (currentChainElement != NULL) {
+ BufferChain nextChainElement = currentChainElement->nextPart;
+ GLOBAL_FREEMEM(currentChainElement);
+ currentChainElement = nextChainElement;
+ }
+}
+
+int /* returns the number of bytes written to the buffer */
+BufferChain_dumpToBuffer(BufferChain self, uint8_t* buffer, int bufferMaxSize)
+{
+ if (self->length > bufferMaxSize)
+ return 0;
+
+ BufferChain currentChain = self;
+
+ int currentBufferIndex = 0;
+
+ do {
+ int currentChainIndex = 0;
+ int currentPartLength = self->partLength;
+
+ while (currentChainIndex < currentPartLength)
+ buffer[currentBufferIndex++] = self->buffer[currentChainIndex++];
+
+ currentChain = currentChain->nextPart;
+ } while (currentChain != NULL);
+
+ return currentBufferIndex;
+}
+
+void
+MemoryArea_initialize(MemoryArea* self, uint8_t* memory, int size)
+{
+ self->memory = memory;
+ self->size = size;
+ self->currentPos = 0;
+}
+
+uint8_t*
+MemoryArea_getNextBlock(MemoryArea* self, int size)
+{
+ if ((self->size - self->currentPos) >= size) {
+ uint8_t* newBlock = self->memory + self->currentPos;
+
+ self->currentPos += size;
+ return newBlock;
+ }
+ else
+ return NULL;
+
+}
diff --git a/src/common/byte_buffer.c b/src/common/byte_buffer.c
new file mode 100644
index 0000000..9c1a4f9
--- /dev/null
+++ b/src/common/byte_buffer.c
@@ -0,0 +1,123 @@
+/*
+ * byte_buffer.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 "libiec61850_platform_includes.h"
+#include "byte_buffer.h"
+
+ByteBuffer*
+ByteBuffer_create(ByteBuffer* self, int maxSize)
+{
+ if (self == NULL) {
+ self = (ByteBuffer*) GLOBAL_CALLOC(1, sizeof(ByteBuffer));
+ }
+
+ self->buffer = (uint8_t*) GLOBAL_CALLOC(maxSize, sizeof(uint8_t));
+ self->maxSize = maxSize;
+ self->size = 0;
+
+ return self;
+}
+
+void
+ByteBuffer_destroy(ByteBuffer* self)
+{
+ GLOBAL_FREEMEM(self->buffer);
+ GLOBAL_FREEMEM(self);
+}
+
+void
+ByteBuffer_wrap(ByteBuffer* self, uint8_t* buf, int size, int maxSize)
+{
+ self->buffer = buf;
+ self->size = size;
+ self->maxSize = maxSize;
+}
+
+int
+ByteBuffer_append(ByteBuffer* self, uint8_t* data, int dataSize)
+{
+ if (self->size + dataSize <= self->maxSize) {
+ memcpy(self->buffer + self->size, data, dataSize);
+ self->size += dataSize;
+ return dataSize;
+ }
+ else
+ return -1;
+}
+
+int
+ByteBuffer_appendByte(ByteBuffer* self, uint8_t byte)
+{
+ if (self->size < self->maxSize) {
+ self->buffer[self->size] = byte;
+ self->size ++;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+
+uint8_t*
+ByteBuffer_getBuffer(ByteBuffer* self)
+{
+ return self->buffer;
+}
+
+int
+ByteBuffer_getMaxSize(ByteBuffer* self)
+{
+ return self->maxSize;
+}
+
+int
+ByteBuffer_getSize(ByteBuffer* self)
+{
+ return self->size;
+}
+
+int
+ByteBuffer_setSize(ByteBuffer* self, int size)
+{
+ if (size <= self->maxSize)
+ self->size = size;
+
+ return self->size;
+}
+
+#if 0
+void
+ByteBuffer_print(ByteBuffer* self, char* message)
+{
+ printf("\n%s (size = %i):\n", message, self->size);
+
+ int i;
+ for (i = 0; i < self->size; i++) {
+ printf("%02x ", self->buffer[i]);
+ if (((i + 1) % 16) == 0) printf("\n");
+ else if (((i + 1) % 8) == 0) printf("| ");
+
+ }
+ printf("\n");
+}
+#endif
diff --git a/src/common/conversions.c b/src/common/conversions.c
new file mode 100644
index 0000000..9512722
--- /dev/null
+++ b/src/common/conversions.c
@@ -0,0 +1,280 @@
+/*
+ * conversions.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 "libiec61850_platform_includes.h"
+#include "conversions.h"
+
+#include
+
+#if defined TARGET
+#if (TARGET == UCLINUX-WAGO)
+time_t timegm (struct tm *tm)
+{
+ time_t ret;
+ char *tz;
+
+ tz = getenv ("TZ");
+ setenv ("TZ", "", 1);
+ tzset ();
+ ret = mktime (tm);
+ if (tz)
+ setenv ("TZ", tz, 1);
+ else
+ unsetenv ("TZ");
+ tzset ();
+ return ret;
+}
+
+#endif
+#endif
+
+#ifdef _WIN32
+
+time_t
+timegm(struct tm* tm_time)
+{
+ return mktime(tm_time) - _timezone;
+}
+
+#if defined(__MINGW32__)
+
+static inline // assuming gmtime is thread safe in windows!
+struct tm* gmtime_r(const time_t* timep, struct tm* result)
+{
+ struct tm* t;
+
+ t = gmtime(timep);
+
+ if (t != NULL)
+ memcpy(result, t, sizeof (struct tm));
+
+ return result;
+}
+
+#else
+
+#if defined(_MSC_VER)
+
+static inline
+struct tm* gmtime_r(const time_t* timep, struct tm* result)
+{
+ gmtime_s(result, timep);
+
+ return result;
+}
+
+#else
+#error "No gmtime_r available for platform!"
+#endif
+
+
+#endif
+
+
+#endif
+
+void
+Conversions_intToStringBuffer(int intValue, int numberOfDigits, uint8_t* buffer)
+{
+ int digitBase = 1;
+
+ int i = 1;
+
+ while (i < numberOfDigits) {
+ digitBase = digitBase * 10;
+ i++;
+ }
+
+ int remainder = intValue;
+
+ for (i = 0; i < numberOfDigits; i++) {
+ int digit = remainder / digitBase;
+
+ buffer[i] = (uint8_t) (digit + 48);
+
+ remainder = remainder % digitBase;
+
+ digitBase = digitBase / 10;
+ }
+
+ buffer[i] = 0;
+}
+
+void
+Conversions_msTimeToGeneralizedTime(uint64_t msTime, uint8_t* buffer)
+{
+ int msPart = (msTime % 1000);
+
+ time_t unixTime = (msTime / 1000);
+
+ struct tm tmTime;
+
+ gmtime_r(&unixTime, &tmTime);
+
+ Conversions_intToStringBuffer(tmTime.tm_year + 1900, 4, buffer);
+
+ Conversions_intToStringBuffer(tmTime.tm_mon + 1, 2, buffer + 4);
+ Conversions_intToStringBuffer(tmTime.tm_mday, 2, buffer + 6);
+ Conversions_intToStringBuffer(tmTime.tm_hour, 2, buffer + 8);
+ Conversions_intToStringBuffer(tmTime.tm_min, 2, buffer + 10);
+ Conversions_intToStringBuffer(tmTime.tm_sec, 2, buffer + 12);
+
+ buffer[14] = '.';
+
+ Conversions_intToStringBuffer(msPart, 3, buffer + 15);
+
+ buffer[18] = 'Z';
+
+ buffer[19] = 0;
+}
+
+static int
+getSecondsOffset(const char* offsetString)
+{
+ int hourOffset = StringUtils_digitsToInt(offsetString, 2);
+
+ if (hourOffset < 0)
+ return -1;
+
+ int minOffset = StringUtils_digitsToInt(offsetString + 2, 2);
+
+ if (minOffset < 0)
+ return -1;
+
+ int secondsOffset = (hourOffset * (60 * 60)) + (minOffset * 60);
+
+ return secondsOffset;
+}
+
+uint64_t
+Conversions_generalizedTimeToMsTime(const char* gtString)
+{
+ int gtStringLen = strlen(gtString);
+
+ if (gtStringLen < 14) return -1;
+
+ int year = StringUtils_digitsToInt(gtString, 4);
+
+ if (year < 0) return -1;
+
+ int month = StringUtils_digitsToInt(gtString + 4, 2);
+
+ if (month < 0) return -1;
+
+ int day = StringUtils_digitsToInt(gtString + 6, 2);
+
+ if (day < 0) return -1;
+
+ int hour = StringUtils_digitsToInt(gtString + 8, 2);
+
+ if (hour < 0) return -1;
+
+ int min = StringUtils_digitsToInt(gtString + 10, 2);
+
+ if (min < 0) return -1;
+
+ int seconds = StringUtils_digitsToInt(gtString + 12, 2);
+ if (seconds < 0) return -1;
+
+ struct tm tmTime;
+ tmTime.tm_year = year - 1900;
+ tmTime.tm_mon = month - 1;
+ tmTime.tm_mday = day;
+ tmTime.tm_hour = hour;
+ tmTime.tm_min = min;
+ tmTime.tm_sec = seconds;
+
+ int msOffset = 0;
+
+ const char* parsePos = gtString + 14;
+
+ /* parse optional fraction of second field */
+ if (*(parsePos) == '.') {
+ parsePos++;
+ const char* fractionOfSecondStart = parsePos;
+
+ int fractionOfSecondLen = 0;
+
+ int secondValue = 1;
+
+ while (StringUtils_isDigit(fractionOfSecondStart[fractionOfSecondLen])) {
+ fractionOfSecondLen++;
+
+ secondValue = secondValue * 10;
+ }
+
+ if (fractionOfSecondLen > 0) {
+ int fractionOfSecond = StringUtils_digitsToInt(fractionOfSecondStart, fractionOfSecondLen);
+ msOffset = (fractionOfSecond * 1000) / secondValue;
+ }
+
+ parsePos += fractionOfSecondLen;
+ }
+
+
+ time_t t = 0;
+
+ switch (*parsePos) {
+ case 0: /* treat time as localtime */
+ t = mktime(&tmTime);
+ break;
+ case 'Z': /* treat time as GMT(UTC) time */
+ t = timegm(&tmTime);
+ break;
+ case '+': /* subtract offset */
+ {
+ t = timegm(&tmTime);
+ int secondsOffset = getSecondsOffset(parsePos + 1);
+ t = t - secondsOffset;
+ }
+ break;
+ case '-': /* add offset */
+ {
+ t = timegm(&tmTime);
+ int secondsOffset = getSecondsOffset(parsePos + 1);
+ t = t + secondsOffset;
+ }
+ break;
+ default:
+ return -1;
+ }
+
+ uint64_t msTime = t * 1000;
+
+ msTime += msOffset;
+
+ return msTime;
+}
+
+void
+memcpyReverseByteOrder(uint8_t* dst, const uint8_t* src, int size)
+{
+ int i = 0;
+ for (i = 0; i < size; i++) {
+ dst[i] = src[size - i - 1];
+ }
+}
+
+
+
+
diff --git a/src/common/inc/array_list.h b/src/common/inc/array_list.h
new file mode 100644
index 0000000..50245c9
--- /dev/null
+++ b/src/common/inc/array_list.h
@@ -0,0 +1,31 @@
+/*
+ * array_list.h
+ *
+ * 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.
+ */
+
+#ifndef ARRAY_LIST_H_
+#define ARRAY_LIST_H_
+
+int
+ArrayList_listSize(void** list);
+
+
+#endif /* ARRAY_LIST_H_ */
diff --git a/src/common/inc/buffer_chain.h b/src/common/inc/buffer_chain.h
new file mode 100644
index 0000000..9c335a8
--- /dev/null
+++ b/src/common/inc/buffer_chain.h
@@ -0,0 +1,75 @@
+/*
+ * buffer_chain.h
+ *
+ * Created on: Nov 10, 2013
+ * Author: mzillgit
+ */
+
+#ifndef BUFFER_CHAIN_H_
+#define BUFFER_CHAIN_H_
+
+typedef struct sBufferChain* BufferChain;
+
+struct sBufferChain {
+ int length;
+ int partLength;
+ int partMaxLength;
+ uint8_t* buffer;
+ BufferChain nextPart;
+};
+
+void
+BufferChain_init(BufferChain self, int length, int partLength, BufferChain nextPart, uint8_t* buffer);
+
+void
+BufferChain_destroy(BufferChain self);
+
+int /* returns the number of bytes written to the buffer */
+BufferChain_dumpToBuffer(BufferChain self, uint8_t* buffer, int bufferMaxSize);
+
+
+typedef struct {
+ uint8_t* memory;
+ int currentPos;
+ int size;
+} MemoryArea;
+
+void
+MemoryArea_initialize(MemoryArea* self, uint8_t* memory, int size);
+
+uint8_t*
+MemoryArea_getNextBlock(MemoryArea* self, int size);
+
+#if 0
+
+typedef struct sMemoryPool* MemoryPool;
+
+typedef struct sMemoryChunk MemoryChunk;
+
+struct sMemoryPool {
+ uint8_t* memory;
+ int size;
+ MemoryChunk firstChunk;
+};
+
+struct sMemoryChunk {
+ MemoryChunk previous;
+ MemoryChunk next;
+ uint8_t* data;
+ uint8_t free;
+ int size;
+};
+
+MemoryPool
+MemoryPool_create(uint8_t* memoryAddress, int size);
+
+void
+MemoryPool_destroy(MemoryPool self);
+
+MemoryChunk
+MemoryPool_allocateChunk(MemoryPool self, int size);
+MemoryPool_freeChunk(MemoryPool self, MemoryChunk chunk);
+
+#endif
+
+#endif /* BUFFER_CHAIN_H_ */
diff --git a/src/common/inc/byte_buffer.h b/src/common/inc/byte_buffer.h
new file mode 100644
index 0000000..0358a9a
--- /dev/null
+++ b/src/common/inc/byte_buffer.h
@@ -0,0 +1,74 @@
+/*
+ * byte_buffer.h
+ *
+ * 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.
+ */
+
+#ifndef BYTE_BUFFER_H_
+#define BYTE_BUFFER_H_
+
+#include "libiec61850_common_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ uint8_t* buffer;
+ int maxSize;
+ int size;
+} ByteBuffer;
+
+ByteBuffer*
+ByteBuffer_create(ByteBuffer* self, int maxSize);
+
+void
+ByteBuffer_destroy(ByteBuffer* self);
+
+void
+ByteBuffer_wrap(ByteBuffer* self, uint8_t* buf, int size, int maxSize);
+
+int
+ByteBuffer_append(ByteBuffer* self, uint8_t* data, int dataSize);
+
+int
+ByteBuffer_appendByte(ByteBuffer* self, uint8_t byte);
+
+uint8_t*
+ByteBuffer_getBuffer(ByteBuffer* self);
+
+int
+ByteBuffer_getSize(ByteBuffer* self);
+
+int
+ByteBuffer_getMaxSize(ByteBuffer* self);
+
+int
+ByteBuffer_setSize(ByteBuffer* self, int size);
+
+void
+ByteBuffer_print(ByteBuffer* self, char* message);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* BYTE_BUFFER_H_ */
diff --git a/src/common/inc/conversions.h b/src/common/inc/conversions.h
new file mode 100644
index 0000000..03b1269
--- /dev/null
+++ b/src/common/inc/conversions.h
@@ -0,0 +1,43 @@
+/*
+ * conversions.h
+ *
+ * Some helper functions to convert data.
+ *
+ * Copyright 2014 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.
+ */
+
+#ifndef CONVERSIONS_H_
+#define CONVERSIONS_H_
+
+#include "libiec61850_platform_includes.h"
+
+void
+Conversions_intToStringBuffer(int intValue, int numberOfDigits, uint8_t* buffer);
+
+void
+Conversions_msTimeToGeneralizedTime(uint64_t msTime, uint8_t* buffer);
+
+uint64_t
+Conversions_generalizedTimeToMsTime(const char* gtString);
+
+void
+memcpyReverseByteOrder(uint8_t* dst, const uint8_t* src, int size);
+
+#endif /* CONVERSIONS_H_ */
diff --git a/src/common/inc/lib_memory.h b/src/common/inc/lib_memory.h
new file mode 100644
index 0000000..506a24c
--- /dev/null
+++ b/src/common/inc/lib_memory.h
@@ -0,0 +1,65 @@
+/*
+ * memory.h
+ *
+ * Copyright 2014 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.
+ */
+
+#ifndef MEMORY_H_
+#define MEMORY_H_
+
+#define CALLOC(nmemb, size) Memory_calloc(nmemb, size)
+#define MALLOC(size) Memory_malloc(size)
+#define REALLOC(oldptr, size) Memory_realloc(oldptr, size)
+#define FREEMEM(ptr) Memory_free(ptr)
+
+#define GLOBAL_CALLOC(nmemb, size) Memory_calloc(nmemb, size)
+#define GLOBAL_MALLOC(size) Memory_malloc(size)
+#define GLOBAL_REALLOC(oldptr, size) Memory_realloc(oldptr, size)
+#define GLOBAL_FREEMEM(ptr) Memory_free(ptr)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+
+typedef void
+(*MemoryExceptionHandler) (void* parameter);
+
+void
+Memory_installExceptionHandler(MemoryExceptionHandler handler, void* parameter);
+
+void*
+Memory_malloc(size_t size);
+
+void*
+Memory_calloc(size_t nmemb, size_t size);
+
+void *
+Memory_realloc(void *ptr, size_t size);
+
+void
+Memory_free(void* memb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MEMORY_H_ */
diff --git a/src/common/inc/libiec61850_common_api.h b/src/common/inc/libiec61850_common_api.h
new file mode 100644
index 0000000..eb82865
--- /dev/null
+++ b/src/common/inc/libiec61850_common_api.h
@@ -0,0 +1,23 @@
+/*
+ * libiec61850_common_api_includes.h
+ */
+
+#ifndef LIBIEC61850_COMMON_API_INCLUDES_H_
+#define LIBIEC61850_COMMON_API_INCLUDES_H_
+
+#include
+#include
+#include
+#include
+#include
+
+#ifdef __GNUC__
+#define ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+#define ATTRIBUTE_PACKED
+#endif
+
+#include "hal_time.h"
+#include "mms_value.h"
+
+#endif /* LIBIEC61850_COMMON_API_INCLUDES_H_ */
diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h
new file mode 100644
index 0000000..9a9f909
--- /dev/null
+++ b/src/common/inc/libiec61850_platform_includes.h
@@ -0,0 +1,40 @@
+/*
+ * libiec61850_platform_includes.h
+ */
+
+#ifndef LIBIEC61850_PLATFORM_INCLUDES_H_
+#define LIBIEC61850_PLATFORM_INCLUDES_H_
+
+#include "libiec61850_common_api.h"
+
+#include "string_utilities.h"
+#include
+#include
+#include
+#include
+
+#include "platform_endian.h"
+
+#define LIBIEC61850_VERSION "0.8.7"
+
+#ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME
+#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com"
+#endif
+
+#ifndef CONFIG_DEFAULT_MMS_MODEL_NAME
+#define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850"
+#endif
+
+#ifndef CONFIG_DEFAULT_MMS_REVISION
+#define CONFIG_DEFAULT_MMS_REVISION LIBIEC61850_VERSION
+#endif
+
+#if (DEBUG != 1)
+#define NDEBUG 1
+#endif
+
+#include
+
+#include "lib_memory.h"
+
+#endif /* LIBIEC61850_PLATFORM_INCLUDES_H_ */
diff --git a/src/common/inc/linked_list.h b/src/common/inc/linked_list.h
new file mode 100644
index 0000000..4309e9a
--- /dev/null
+++ b/src/common/inc/linked_list.h
@@ -0,0 +1,180 @@
+/*
+ * linked_list.h
+ *
+ * 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.
+ */
+
+#ifndef LINKED_LIST_H_
+#define LINKED_LIST_H_
+
+#include "libiec61850_common_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \addtogroup common_api_group
+ */
+/**@{*/
+
+/**
+ * \defgroup LINKED_LIST LinkedList data type definition and handling functions
+ */
+/**@{*/
+
+
+struct sLinkedList {
+ void* data;
+ struct sLinkedList* next;
+};
+
+/**
+ * \brief Reference to a linked list or to a linked list element.
+ */
+typedef struct sLinkedList* LinkedList;
+
+/**
+ * \brief Create a new LinkedList object
+ *
+ * \return the newly created LinkedList instance
+ */
+LinkedList
+LinkedList_create(void);
+
+/**
+ * \brief Delete a LinkedList object
+ *
+ * This function destroy the LinkedList object. It will free all data structures used by the LinkedList
+ * instance. It will call free for all elements of the linked list. This function should only be used if
+ * simple objects (like dynamically allocated strings) are stored in the linked list.
+ *
+ * \param self the LinkedList instance
+ */
+void
+LinkedList_destroy(LinkedList self);
+
+
+typedef void (*LinkedListValueDeleteFunction) (void*);
+
+/**
+ * \brief Delete a LinkedList object
+ *
+ * This function destroy the LinkedList object. It will free all data structures used by the LinkedList
+ * instance. It will call a user provided function for each data element. This user provided function is
+ * responsible to properly free the data element.
+ *
+ * \param self the LinkedList instance
+ * \param valueDeleteFunction a function that is called for each data element of the LinkedList with the pointer
+ * to the linked list data element.
+ */
+void
+LinkedList_destroyDeep(LinkedList self, LinkedListValueDeleteFunction valueDeleteFunction);
+
+/**
+ * \brief Delete a LinkedList object without freeing the element data
+ *
+ * This function should be used statically allocated data objects are stored in the LinkedList instance.
+ * Other use cases would be if the data elements in the list should not be deleted.
+ *
+ * \param self the LinkedList instance
+ */
+void
+LinkedList_destroyStatic(LinkedList self);
+
+/**
+ * \brief Add a new element to the list
+ *
+ * This function will add a new data element to the list. The new element will the last element in the
+ * list.
+ *
+ * \param self the LinkedList instance
+ * \param data data to append to the LinkedList instance
+ */
+void
+LinkedList_add(LinkedList self, void* data);
+
+/**
+ * \brief Removed the specified element from the list
+ *
+ * \param self the LinkedList instance
+ * \param data data to remove from the LinkedList instance
+ */
+bool
+LinkedList_remove(LinkedList self, void* data);
+
+/**
+ * \brief Get the list element specified by index (starting with 0).
+ *
+ * \param self the LinkedList instance
+ * \param index index of the requested element.
+ */
+LinkedList
+LinkedList_get(LinkedList self, int index);
+
+/**
+ * \brief Get the next element in the list (iterator).
+ *
+ * \param self the LinkedList instance
+ */
+LinkedList
+LinkedList_getNext(LinkedList self);
+
+/**
+ * \brief Get the last element in the list.
+ *
+ * \param listElement the LinkedList instance
+ */
+LinkedList
+LinkedList_getLastElement(LinkedList self);
+
+/**
+ * \brief Insert a new element int the list
+ *
+ * \param listElement the LinkedList instance
+ */
+LinkedList
+LinkedList_insertAfter(LinkedList listElement, void* data);
+
+/**
+ * \brief Get the size of the list
+ *
+ * \param self the LinkedList instance
+ *
+ * \return number of data elements stored in the list
+ */
+int
+LinkedList_size(LinkedList self);
+
+void*
+LinkedList_getData(LinkedList self);
+
+void
+LinkedList_printStringList(LinkedList self);
+
+/**@}*/
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINKED_LIST_H_ */
diff --git a/src/common/inc/map.h b/src/common/inc/map.h
new file mode 100644
index 0000000..9b34014
--- /dev/null
+++ b/src/common/inc/map.h
@@ -0,0 +1,64 @@
+/*
+ * map.h
+ *
+ * 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.
+ */
+
+#ifndef MAP_H_
+#define MAP_H_
+
+#include "libiec61850_platform_includes.h"
+#include "linked_list.h"
+
+typedef struct sMap* Map;
+
+struct sMap {
+ LinkedList entries;
+
+ /* client provided function to compare two keys */
+ int (*compareKeys)(void* key1, void* key2);
+};
+
+Map
+Map_create(void);
+
+int
+Map_size(Map map);
+
+void*
+Map_addEntry(Map map, void* key, void* value);
+
+void*
+Map_removeEntry(Map map, void* key, bool deleteKey);
+
+void*
+Map_getEntry(Map map, void* key);
+
+void
+Map_delete(Map map, bool deleteKey);
+
+void
+Map_deleteStatic(Map map, bool deleteKey);
+
+void
+Map_deleteDeep(Map map, bool deleteKey, void (*valueDeleteFunction) (void*));
+
+
+#endif /* MAP_H_ */
diff --git a/src/common/inc/mem_alloc_linked_list.h b/src/common/inc/mem_alloc_linked_list.h
new file mode 100644
index 0000000..df88f88
--- /dev/null
+++ b/src/common/inc/mem_alloc_linked_list.h
@@ -0,0 +1,50 @@
+/*
+ * mem_alloc_linked_list.h
+ *
+ * Implementation of linked list (LinkedList) that uses the provided memory buffer as
+ * memory pool for storage allocation.
+ *
+ * Copyright 2014 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.
+ */
+
+#ifndef MEM_ALLOC_LINKED_LIST_H_
+#define MEM_ALLOC_LINKED_LIST_H_
+
+#include "libiec61850_common_api.h"
+#include "linked_list.h"
+#include "simple_allocator.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct sMemAllocLinkedList* MemAllocLinkedList;
+
+MemAllocLinkedList
+MemAllocLinkedList_create(MemoryAllocator* ma);
+
+LinkedList
+MemAllocLinkedList_add(MemAllocLinkedList list, void* data);
+
+#endif /* MEM_ALLOC_LINKED_LIST_H_ */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/common/inc/simple_allocator.h b/src/common/inc/simple_allocator.h
new file mode 100644
index 0000000..7158ac7
--- /dev/null
+++ b/src/common/inc/simple_allocator.h
@@ -0,0 +1,39 @@
+/*
+ * simple_allocator.h
+ *
+ * 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.
+ */
+
+#ifndef SIMPLE_ALLOCATOR_H_
+#define SIMPLE_ALLOCATOR_H_
+
+typedef struct {
+ char* memoryBlock;
+ char* currentPtr;
+ int size;
+} MemoryAllocator;
+
+void
+MemoryAllocator_init(MemoryAllocator* self, char* memoryBlock, int size);
+
+char*
+MemoryAllocator_allocate(MemoryAllocator* self, int size);
+
+#endif /* SIMPLE_ALLOCATOR_H_ */
diff --git a/src/common/inc/string_map.h b/src/common/inc/string_map.h
new file mode 100644
index 0000000..499778b
--- /dev/null
+++ b/src/common/inc/string_map.h
@@ -0,0 +1,28 @@
+/*
+ * string_map.h
+ *
+ * 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 "map.h"
+
+Map
+StringMap_create(void);
+
diff --git a/src/common/inc/string_utilities.h b/src/common/inc/string_utilities.h
new file mode 100644
index 0000000..7c46d67
--- /dev/null
+++ b/src/common/inc/string_utilities.h
@@ -0,0 +1,110 @@
+/*
+ * string_utilities.h
+ *
+ * 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.
+ */
+
+#ifndef STRING_UTILITIES_H_
+#define STRING_UTILITIES_H_
+
+#include "libiec61850_platform_includes.h"
+#include "linked_list.h"
+
+char*
+copyString(const char* string);
+
+char*
+copyStringToBuffer(const char* string, char* buffer);
+
+char*
+copySubString(char* startPos, char* endPos);
+
+/**
+ * \brief Concatenate strings. count indicates the number of strings
+ * to concatenate.
+ */
+char*
+createString(int count, ...);
+
+/**
+ * \brief Concatenate strings in user provided buffer. count indicates the number of strings
+ * to concatenate.
+ */
+char*
+StringUtils_createStringInBuffer(char* buffer, int count, ...);
+
+char*
+createStringFromBuffer(const uint8_t* buf, int size);
+
+char*
+StringUtils_createStringFromBufferInBuffer(char* newString, const uint8_t* buf, int size);
+
+void
+StringUtils_replace(char* string, char oldChar, char newChar);
+
+bool
+StringUtils_isDigit(char character);
+
+int
+StringUtils_digitToInt(char digit);
+
+int
+StringUtils_digitsToInt(const char* digits, int count);
+
+int
+StringUtils_createBufferFromHexString(char* hexString, uint8_t* buffer);
+
+/**
+ * \brief test if string starts with prefix
+ */
+bool
+StringUtils_startsWith(char* string, char* prefix);
+
+/**
+ * \brief Compare to characters using the collation order as defined in ISO 9506-2 7.5.2
+ *
+ * \param a the first string
+ * \param b the second string
+ *
+ * \returns 0 if a equals b; a positive number if b > a; a negative number if b < a
+ */
+int
+StringUtils_compareChars(char a, char b);
+
+/**
+ * \brief Compare to strings using the collation order as defined in ISO 9506-2 7.5.2
+ *
+ * \param a the first string
+ * \param b the second string
+ *
+ * \returns 0 if a equals b; a positive number if b > a; a negative number if b < a
+ */
+int
+StringUtils_compareStrings(const char* a, const char* b);
+
+/**
+ * \brief sort a list of strings alphabetically (according to the MMS identifier collation order)
+ *
+ * \param list a list that contains string elements
+ */
+void
+StringUtils_sortList(LinkedList list);
+
+#endif /* STRING_UTILITIES_H_ */
diff --git a/src/common/lib_memory.c b/src/common/lib_memory.c
new file mode 100644
index 0000000..0a4106b
--- /dev/null
+++ b/src/common/lib_memory.c
@@ -0,0 +1,83 @@
+/*
+ * lib_memory.c
+ *
+ * Copyright 2014 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 "libiec61850_platform_includes.h"
+
+static MemoryExceptionHandler exceptionHandler = NULL;
+static void* exceptionHandlerParameter = NULL;
+
+static void
+noMemoryAvailableHandler(void)
+{
+ if (exceptionHandler != NULL)
+ exceptionHandler(exceptionHandlerParameter);
+}
+
+void
+Memory_installExceptionHandler(MemoryExceptionHandler handler, void* parameter)
+{
+ exceptionHandler = handler;
+ exceptionHandlerParameter = parameter;
+}
+
+void*
+Memory_malloc(size_t size)
+{
+ void* memory = malloc(size);
+
+ if (memory == NULL)
+ noMemoryAvailableHandler();
+
+ return memory;
+}
+
+
+void*
+Memory_calloc(size_t nmemb, size_t size)
+{
+ void* memory = calloc(nmemb, size);
+
+ if (memory == NULL)
+ noMemoryAvailableHandler();
+
+ return memory;
+}
+
+
+void *
+Memory_realloc(void *ptr, size_t size)
+{
+ void* memory = realloc(ptr, size);
+
+ if (memory == NULL)
+ noMemoryAvailableHandler();
+
+ return memory;
+}
+
+void
+Memory_free(void* memb)
+{
+ free(memb);
+}
+
diff --git a/src/common/linked_list.c b/src/common/linked_list.c
new file mode 100644
index 0000000..65c88bd
--- /dev/null
+++ b/src/common/linked_list.c
@@ -0,0 +1,200 @@
+/*
+ * linked_list.c
+ *
+ * Copyright 2013, 2014 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 "libiec61850_platform_includes.h"
+#include "linked_list.h"
+
+LinkedList
+LinkedList_getLastElement(LinkedList list)
+{
+ while (list->next != NULL) {
+ list = list->next;
+ }
+ return list;
+}
+
+LinkedList
+LinkedList_create()
+{
+ LinkedList newList;
+
+ newList = (LinkedList) GLOBAL_MALLOC(sizeof(struct sLinkedList));
+ newList->data = NULL;
+ newList->next = NULL;
+
+ return newList;
+}
+
+/**
+ * Destroy list (free). Also frees element data with helper function.
+ */
+void
+LinkedList_destroyDeep(LinkedList list, LinkedListValueDeleteFunction valueDeleteFunction)
+{
+ LinkedList nextElement = list;
+ LinkedList currentElement;
+
+ do {
+ currentElement = nextElement;
+ nextElement = currentElement->next;
+
+ if (currentElement->data != NULL)
+ valueDeleteFunction(currentElement->data);
+
+ GLOBAL_FREEMEM(currentElement);
+ }
+ while (nextElement != NULL);
+}
+
+void
+LinkedList_destroy(LinkedList list)
+{
+ LinkedList_destroyDeep(list, Memory_free);
+}
+
+/**
+ * Destroy list (free) without freeing the element data
+ */
+void
+LinkedList_destroyStatic(LinkedList list)
+{
+ LinkedList nextElement = list;
+ LinkedList currentElement;
+
+ do {
+ currentElement = nextElement;
+ nextElement = currentElement->next;
+ GLOBAL_FREEMEM(currentElement);
+ }
+ while (nextElement != NULL);
+}
+
+int
+LinkedList_size(LinkedList list)
+{
+ LinkedList nextElement = list;
+ int size = 0;
+
+ while (nextElement->next != NULL) {
+ nextElement = nextElement->next;
+ size++;
+ }
+
+ return size;
+}
+
+void
+LinkedList_add(LinkedList list, void* data)
+{
+ LinkedList newElement = LinkedList_create();
+
+ newElement->data = data;
+
+ LinkedList listEnd = LinkedList_getLastElement(list);
+
+ listEnd->next = newElement;
+}
+
+bool
+LinkedList_remove(LinkedList list, void* data)
+{
+ LinkedList lastElement = list;
+
+ LinkedList currentElement = list->next;
+
+ while (currentElement != NULL) {
+ if (currentElement->data == data) {
+ lastElement->next = currentElement->next;
+ GLOBAL_FREEMEM(currentElement);
+ return true;
+ }
+
+ lastElement = currentElement;
+ currentElement = currentElement->next;
+ }
+
+ return false;
+}
+
+LinkedList
+LinkedList_insertAfter(LinkedList list, void* data)
+{
+ LinkedList originalNextElement = LinkedList_getNext(list);
+
+ LinkedList newElement = LinkedList_create();
+
+ newElement->data = data;
+ newElement->next = originalNextElement;
+
+ list->next = newElement;
+
+ return newElement;
+}
+
+LinkedList
+LinkedList_getNext(LinkedList list)
+{
+ return list->next;
+}
+
+LinkedList
+LinkedList_get(LinkedList list, int index)
+{
+ LinkedList element = LinkedList_getNext(list);
+
+ int i = 0;
+
+ while (i < index) {
+ element = LinkedList_getNext(element);
+
+ if (element == NULL)
+ return NULL;
+
+ i++;
+ }
+
+ return element;
+}
+
+void*
+LinkedList_getData(LinkedList self)
+{
+ return self->data;
+}
+
+void
+LinkedList_printStringList(LinkedList list)
+{
+ LinkedList element = list;
+
+ int elementCount = 0;
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ char* str = (char*) (element->data);
+ printf("%s\n", str);
+ elementCount++;
+ }
+}
+
+
+
diff --git a/src/common/map.c b/src/common/map.c
new file mode 100644
index 0000000..d0ab9e3
--- /dev/null
+++ b/src/common/map.c
@@ -0,0 +1,159 @@
+/*
+ * map.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 "libiec61850_platform_includes.h"
+#include "map.h"
+
+typedef struct sMapEntry
+{
+ void* key;
+ void* value;
+} MapEntry;
+
+static int
+comparePointerKeys(void* key1, void* key2)
+{
+ if (key2 == key1)
+ return 0;
+ else
+ return -1;
+}
+
+Map
+Map_create()
+{
+ Map map = (Map) GLOBAL_CALLOC(1, sizeof(struct sMap));
+ map->entries = LinkedList_create();
+ map->compareKeys = comparePointerKeys;
+ return map;
+}
+
+int
+Map_size(Map map)
+{
+ return LinkedList_size(map->entries);
+}
+
+void*
+Map_addEntry(Map map, void* key, void* value)
+{
+ MapEntry* entry = (MapEntry*) GLOBAL_MALLOC(sizeof(MapEntry));
+ entry->key = key;
+ entry->value = value;
+ LinkedList_add(map->entries, entry);
+
+ return entry->key;
+}
+
+void*
+Map_removeEntry(Map map, void* key, bool deleteKey)
+{
+ LinkedList element = map->entries;
+ LinkedList lastElement = element;
+ MapEntry* entry;
+ void* value = NULL;
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ entry = (MapEntry*) element->data;
+
+ if (map->compareKeys(key, entry->key) == 0) {
+ lastElement->next = element->next;
+ value = entry->value;
+
+ if (deleteKey == true)
+ GLOBAL_FREEMEM(entry->key);
+ GLOBAL_FREEMEM(entry);
+ GLOBAL_FREEMEM(element);
+
+ break;
+ }
+
+ lastElement = element;
+ }
+
+ return value;
+}
+
+void*
+Map_getEntry(Map map, void* key)
+{
+ LinkedList element = map->entries;
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ MapEntry* entry = (MapEntry*) element->data;
+ if (map->compareKeys(key, entry->key) == 0) {
+ return entry->value;
+ };
+ }
+
+ return NULL;
+}
+
+void
+Map_delete(Map map, bool deleteKey)
+{
+ LinkedList element = map->entries;
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ MapEntry* entry = (MapEntry*) element->data;
+ if (deleteKey == true)
+ GLOBAL_FREEMEM(entry->key);
+ GLOBAL_FREEMEM(entry->value);
+ }
+
+ LinkedList_destroy(map->entries);
+ GLOBAL_FREEMEM(map);
+}
+
+void
+Map_deleteStatic(Map map, bool deleteKey)
+{
+ LinkedList element = map->entries;
+
+ if (deleteKey == true) {
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ MapEntry* entry = (MapEntry*) element->data;
+ GLOBAL_FREEMEM(entry->key);
+ }
+ }
+
+ LinkedList_destroy(map->entries);
+ GLOBAL_FREEMEM(map);
+}
+
+void
+Map_deleteDeep(Map map, bool deleteKey, void
+(*valueDeleteFunction)(void*))
+{
+ LinkedList element = map->entries;
+
+ while ((element = LinkedList_getNext(element)) != NULL) {
+ MapEntry* entry = (MapEntry*) element->data;
+ if (deleteKey == true)
+ GLOBAL_FREEMEM(entry->key);
+ valueDeleteFunction(entry->value);
+ }
+
+ LinkedList_destroy(map->entries);
+ GLOBAL_FREEMEM(map);
+}
diff --git a/src/common/mem_alloc_linked_list.c b/src/common/mem_alloc_linked_list.c
new file mode 100644
index 0000000..76e5ad8
--- /dev/null
+++ b/src/common/mem_alloc_linked_list.c
@@ -0,0 +1,67 @@
+/*
+ * mem_alloc_linked_list.c
+ *
+ * Copyright 2014 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 "libiec61850_platform_includes.h"
+#include "mem_alloc_linked_list.h"
+
+struct sMemAllocLinkedList {
+ void* data;
+ struct sLinkedList* next;
+ MemoryAllocator* ma;
+};
+
+MemAllocLinkedList
+MemAllocLinkedList_create(MemoryAllocator* ma)
+{
+ MemAllocLinkedList self =
+ (MemAllocLinkedList) MemoryAllocator_allocate(ma, sizeof(struct sMemAllocLinkedList));
+
+ if (self == NULL)
+ return NULL;
+
+ self->ma = ma;
+ self->data = NULL;
+ self->next = NULL;
+
+ return self;
+}
+
+LinkedList
+MemAllocLinkedList_add(MemAllocLinkedList self, void* data)
+{
+ LinkedList newElement = (LinkedList)
+ MemoryAllocator_allocate(self->ma, sizeof(struct sLinkedList));
+
+ if (newElement == NULL)
+ return NULL;
+
+ newElement->data = data;
+ newElement->next = NULL;
+
+ LinkedList listEnd = LinkedList_getLastElement((LinkedList) self);
+
+ listEnd->next = newElement;
+
+ return newElement;
+}
+
diff --git a/src/common/simple_allocator.c b/src/common/simple_allocator.c
new file mode 100644
index 0000000..89c9940
--- /dev/null
+++ b/src/common/simple_allocator.c
@@ -0,0 +1,56 @@
+/*
+ * simple_allocator.c
+ *
+ * Copyright 2013, 2014 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 "libiec61850_platform_includes.h"
+#include "simple_allocator.h"
+
+void
+MemoryAllocator_init(MemoryAllocator* self, char* memoryBlock, int size)
+{
+ self->memoryBlock = memoryBlock;
+ self->currentPtr = memoryBlock;
+ self->size = size;
+}
+
+static int
+getAlignedSize(int size)
+{
+ if ((size % sizeof(void*)) > 0)
+ return sizeof(void*) * ((size + sizeof(void*) - 1) / sizeof(void*));
+ else
+ return size;
+}
+
+char*
+MemoryAllocator_allocate(MemoryAllocator* self, int size)
+{
+ size = getAlignedSize(size);
+
+ if (((self->currentPtr - self->memoryBlock) + size) <= self->size) {
+ char* ptr = self->currentPtr;
+ self->currentPtr += size;
+ return ptr;
+ }
+ else
+ return NULL;
+}
diff --git a/src/common/string_map.c b/src/common/string_map.c
new file mode 100644
index 0000000..1528218
--- /dev/null
+++ b/src/common/string_map.c
@@ -0,0 +1,32 @@
+/*
+ * string_map.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 "libiec61850_platform_includes.h"
+#include "string_map.h"
+
+Map
+StringMap_create() {
+ Map map = Map_create();
+ map->compareKeys = (int (*) (void*, void*)) strcmp;
+ return map;
+}
diff --git a/src/common/string_utilities.c b/src/common/string_utilities.c
new file mode 100644
index 0000000..b33a3f7
--- /dev/null
+++ b/src/common/string_utilities.c
@@ -0,0 +1,363 @@
+/*
+ * string_utilities.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 "libiec61850_platform_includes.h"
+
+char*
+copySubString(char* startPos, char* endPos)
+{
+ int newStringLength = endPos - startPos;
+
+ char* newString = (char*) GLOBAL_MALLOC(newStringLength) + 1;
+
+ memcpy(newString, startPos, newStringLength);
+
+ newString[newStringLength] = 0;
+
+ return newString;
+}
+
+char*
+copyString(const char* string)
+{
+ int newStringLength = strlen(string) + 1;
+
+ char* newString = (char*) GLOBAL_MALLOC(newStringLength);
+
+ memcpy(newString, string, newStringLength);
+
+ return newString;
+}
+
+char*
+copyStringToBuffer(const char* string, char* buffer)
+{
+ int newStringLength = strlen(string) + 1;
+
+ memcpy(buffer, string, newStringLength);
+
+ return buffer;
+}
+
+
+char*
+createStringFromBuffer(const uint8_t* buf, int size)
+{
+ char* newStr = (char*) GLOBAL_MALLOC(size + 1);
+
+ memcpy(newStr, buf, size);
+ newStr[size] = 0;
+
+ return newStr;
+}
+
+char*
+StringUtils_createStringFromBufferInBuffer(char* newString, const uint8_t* buf, int size)
+{
+ memcpy(newString, buf, size);
+ newString[size] = 0;
+
+ return newString;
+}
+
+
+char*
+StringUtils_createStringInBuffer(char* newStr, int count, ...)
+{
+ va_list ap;
+ char* currentPos = newStr;
+ int i;
+
+ va_start(ap, count);
+ for (i = 0; i < count; i++) {
+ char* str = va_arg(ap, char*);
+ strcpy(currentPos, str);
+ currentPos += strlen(str);
+ }
+ va_end(ap);
+
+ *currentPos = 0;
+
+ return newStr;
+}
+
+char*
+createString(int count, ...)
+{
+ va_list ap;
+ char* newStr;
+ char* currentPos;
+ int newStringLength = 0;
+ int i;
+
+ /* Calculate new string length */
+ va_start(ap, count);
+ for (i = 0; i < count; i++) {
+ char* str = va_arg(ap, char*);
+
+ newStringLength += strlen(str);
+ }
+ va_end(ap);
+
+ newStr = (char*) GLOBAL_MALLOC(newStringLength + 1);
+ currentPos = newStr;
+
+
+ va_start(ap, count);
+ for (i = 0; i < count; i++) {
+ char* str = va_arg(ap, char*);
+ strcpy(currentPos, str);
+ currentPos += strlen(str);
+ }
+ va_end(ap);
+
+ *currentPos = 0;
+
+ return newStr;
+}
+
+void
+StringUtils_replace(char* string, char oldChar, char newChar)
+{
+ int len = strlen(string);
+ int i;
+
+ for (i = 0; i < len; i++){
+ if (string[i] == oldChar)
+ string[i] = newChar;
+ }
+}
+
+bool
+StringUtils_isDigit(char character)
+{
+ if ((character > 47) && (character < 58))
+ return true;
+ else
+ return false;
+}
+
+int
+StringUtils_digitToInt(char digit)
+{
+ if (StringUtils_isDigit(digit)) {
+ return (digit - 48);
+ }
+ else
+ return -1;
+}
+
+int
+StringUtils_digitsToInt(const char* digits, int count)
+{
+ int i = 0;
+ int value = 0;
+
+ while (i < count) {
+ value = value * 10;
+
+ int digitValue = StringUtils_digitToInt(*(digits + i));
+
+ if (digitValue == -1)
+ return -1;
+
+ value += digitValue;
+
+ i++;
+ }
+
+ return value;
+}
+
+static int
+toInt(char c)
+{
+ if (c >= '0' && c <= '9') return c - '0';
+ if (c >= 'A' && c <= 'F') return 10 + c - 'A';
+ if (c >= 'a' && c <= 'f') return 10 + c - 'a';
+ return -1;
+}
+
+int
+StringUtils_createBufferFromHexString(char* hexString, uint8_t* buffer)
+{
+ int hexStringLen = strlen(hexString);
+ int i;
+ int bytesCount = 0;
+
+ if (hexStringLen % 2 != 0)
+ return -1;
+
+ for (i = 0; i < (hexStringLen/2); i++) {
+ int high = toInt(hexString[i * 2]);
+ if (high == -1) return -1;
+
+ int low = toInt(hexString[(i * 2) + 1]);
+ if (low == -1) return -1;
+
+ buffer[i] = (uint8_t) (high * 16 + low);
+ bytesCount += 1;
+ }
+
+ return bytesCount;
+}
+
+bool
+StringUtils_startsWith(char* string, char* prefix)
+{
+ int index = 0;
+
+ while ((string[index] != 0) && (prefix[index] != 0)) {
+ if (string[index] != prefix[index])
+ return false;
+
+ index++;
+ }
+
+ if (prefix[index] == 0)
+ return true;
+
+ return false;
+}
+
+#define LT_MAX_CHARS 128
+
+static int
+getCharWeight(int c)
+{
+ static bool initialized = false;
+ static char lookupTable[LT_MAX_CHARS + 1];
+ static char* charOrder = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz$_0123456789";
+
+ if (!initialized) {
+ int ltIndex;
+ int weight = 1;
+
+ for (ltIndex = 1; ltIndex < LT_MAX_CHARS; ltIndex++) {
+ if (strchr(charOrder, ltIndex)) continue;
+ lookupTable[ltIndex] = weight;
+ weight++;
+ }
+
+ int charIndex;
+
+ for (charIndex = 0; charOrder[charIndex]; charIndex++) {
+ lookupTable[(int)charOrder[charIndex]] = weight;
+ weight++;
+ }
+
+ initialized = true;
+ }
+
+ if ((c < 1) || (c > LT_MAX_CHARS))
+ return c;
+ else
+ return lookupTable[c];
+}
+
+int
+StringUtils_compareChars(char a, char b)
+{
+ return (getCharWeight(a) - getCharWeight(b));
+}
+
+int
+StringUtils_compareStrings(const char* a, const char* b)
+{
+ int diff = StringUtils_compareChars(*a, *b);
+
+ while (diff == 0) {
+ if ((*a == 0) || (*b == 0)) {
+ return b - a;
+ }
+
+ diff = StringUtils_compareChars(*++a, *++b);
+ }
+
+ return diff;
+}
+
+void
+StringUtils_sortList(LinkedList list)
+{
+ LinkedList selectedElement = list->next;
+
+ if (selectedElement == NULL) /* list is empty */
+ return;
+
+ list->next = selectedElement->next;
+ selectedElement->next = NULL;
+
+ struct sLinkedList sortedListData;
+
+ LinkedList sortedList = &sortedListData;
+
+ sortedList->next = selectedElement;
+
+ selectedElement = list->next;
+
+ while (selectedElement != NULL) {
+
+ list->next = selectedElement->next;
+ selectedElement->next = NULL;
+
+ char* str1 = (char*) LinkedList_getData(selectedElement);
+
+ LinkedList prevElement = sortedList;
+
+ while (true) {
+
+ if (prevElement->next == NULL) {
+ prevElement->next = selectedElement;
+ break;
+ }
+
+ char* str2 = (char*) LinkedList_getData(prevElement->next);
+
+ if (StringUtils_compareStrings(str1, str2) < 0) {
+
+ /* insert "nextElement" before */
+ if (sortedList == prevElement) {
+ selectedElement->next = sortedList->next;
+ sortedList->next = selectedElement;
+ }
+ else {
+ selectedElement->next = prevElement->next;
+ prevElement->next = selectedElement;
+ }
+
+ break;
+ }
+
+ prevElement = prevElement->next;
+ }
+
+ selectedElement = list->next;
+
+ if (selectedElement == NULL)
+ break;
+ }
+
+ list->next = sortedList->next;
+}
+
diff --git a/src/doxygen.config b/src/doxygen.config
new file mode 100644
index 0000000..f627595
--- /dev/null
+++ b/src/doxygen.config
@@ -0,0 +1,1150 @@
+# Doxyfile 1.7.6.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+DOXYFILE_ENCODING = UTF-8
+
+PROJECT_NAME = "libIEC61850"
+
+PROJECT_NUMBER = 0.8.7
+
+PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE server and client library"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ../doxydoc
+
+CREATE_SUBDIRS = NO
+
+OUTPUT_LANGUAGE = English
+
+BRIEF_MEMBER_DESC = YES
+
+REPEAT_BRIEF = YES
+
+ABBREVIATE_BRIEF =
+
+ALWAYS_DETAILED_SEC = NO
+
+INLINE_INHERITED_MEMB = NO
+
+FULL_PATH_NAMES = YES
+
+STRIP_FROM_PATH =
+
+STRIP_FROM_INC_PATH =
+
+SHORT_NAMES = NO
+
+JAVADOC_AUTOBRIEF = NO
+
+QT_AUTOBRIEF = NO
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+INHERIT_DOCS = YES
+
+SEPARATE_MEMBER_PAGES = NO
+
+TAB_SIZE = 8
+
+ALIASES =
+
+TCL_SUBST =
+
+OPTIMIZE_OUTPUT_FOR_C = YES.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+EXTENSION_MAPPING =
+
+BUILTIN_STL_SUPPORT = NO
+
+CPP_CLI_SUPPORT = NO
+
+SIP_SUPPORT = NO
+
+IDL_PROPERTY_SUPPORT = YES
+
+DISTRIBUTE_GROUP_DOC = NO
+
+SUBGROUPING = YES
+
+INLINE_GROUPED_CLASSES = NO
+
+INLINE_SIMPLE_STRUCTS = NO
+
+TYPEDEF_HIDES_STRUCT = YES
+
+SYMBOL_CACHE_SIZE = 0
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+EXTRACT_ALL = YES
+
+EXTRACT_PRIVATE = NO
+
+EXTRACT_STATIC = NO
+
+EXTRACT_LOCAL_CLASSES = YES
+
+EXTRACT_LOCAL_METHODS = NO
+
+EXTRACT_ANON_NSPACES = NO
+
+HIDE_UNDOC_MEMBERS = NO
+
+HIDE_UNDOC_CLASSES = NO
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+HIDE_IN_BODY_DOCS = NO
+
+INTERNAL_DOCS = NO
+
+CASE_SENSE_NAMES = YES
+
+HIDE_SCOPE_NAMES = NO
+
+SHOW_INCLUDE_FILES = YES
+
+FORCE_LOCAL_INCLUDES = NO
+
+INLINE_INFO = YES
+
+SORT_MEMBER_DOCS = YES
+
+SORT_BRIEF_DOCS = NO
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+SORT_GROUP_NAMES = NO
+
+SORT_BY_SCOPE_NAME = NO
+
+STRICT_PROTO_MATCHING = NO
+
+GENERATE_TODOLIST = YES
+
+GENERATE_TESTLIST = YES
+
+GENERATE_BUGLIST = YES
+
+GENERATE_DEPRECATEDLIST= YES
+
+ENABLED_SECTIONS =
+
+MAX_INITIALIZER_LINES = 30
+
+SHOW_USED_FILES = YES
+
+SHOW_DIRECTORIES = NO
+
+SHOW_FILES = YES
+
+SHOW_NAMESPACES = YES
+
+FILE_VERSION_FILTER =
+
+LAYOUT_FILE = doxygen/DoxygenLayout.xml
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+QUIET = NO
+
+WARNINGS = YES
+
+WARN_IF_UNDOCUMENTED = YES
+
+WARN_IF_DOC_ERROR = YES
+
+WARN_NO_PARAMDOC = NO
+
+WARN_FORMAT = "$file:$line: $text"
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = "iec61850/inc/iec61850_client.h"
+INPUT += "mms/inc/mms_value.h"
+INPUT += "common/inc/linked_list.h"
+INPUT += "doxygen/mainpage.doxygen"
+INPUT += "iec61850/inc/iec61850_server.h"
+INPUT += "iec61850/inc/iec61850_common.h"
+INPUT += "iec61850/inc/iec61850_model.h"
+INPUT += "iec61850/inc/iec61850_dynamic_model.h"
+INPUT += "iec61850/inc/iec61850_config_file_parser.h"
+INPUT += "iec61850/inc/iec61850_cdc.h"
+INPUT += "goose/goose_subscriber.h"
+INPUT += "goose/goose_receiver.h"
+INPUT += "mms/inc/mms_device_model.h"
+INPUT += "mms/inc/mms_types.h"
+INPUT += "mms/inc/mms_common.h"
+INPUT += "mms/inc/mms_server.h"
+INPUT += "mms/inc/iso_server.h"
+INPUT += "mms/inc/mms_named_variable_list.h"
+INPUT += "mms/inc/mms_type_spec.h"
+INPUT += "mms/inc/mms_types.h"
+INPUT += "mms/inc/mms_client_connection.h"
+INPUT += "mms/inc/iso_connection_parameters.h"
+INPUT += "hal/inc/hal_socket.h"
+INPUT += "hal/inc/hal_thread.h"
+INPUT += "hal/inc/hal_ethernet.h"
+INPUT += "hal/inc/hal_filesystem.h"
+INPUT += "hal/inc/hal_time.h"
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS =
+
+RECURSIVE = NO
+
+EXCLUDE =
+
+EXCLUDE_SYMLINKS = NO
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command , where
+# is the value of the INPUT_FILTER tag, and is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER = doxygen/header.html
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = doxygen/footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# style sheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET = doxygen/doxygen.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+#
+# Qt Help Project / Custom Filters.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+#
+# Qt Help Project / Filter Attributes.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+ALLEXTERNALS = NO
+
+EXTERNAL_GROUPS = YES
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+CLASS_DIAGRAMS = YES
+
+MSCGEN_PATH =
+
+HIDE_UNDOC_RELATIONS = YES
+
+HAVE_DOT = NO
+
+DOT_NUM_THREADS = 0
+
+DOT_FONTNAME = Helvetica
+
+DOT_FONTSIZE = 10
+
+DOT_FONTPATH =
+
+CLASS_GRAPH = YES
+
+COLLABORATION_GRAPH = YES
+
+GROUP_GRAPHS = YES
+
+UML_LOOK = NO
+
+TEMPLATE_RELATIONS = NO
+
+INCLUDE_GRAPH = YES
+
+INCLUDED_BY_GRAPH = YES
+
+CALL_GRAPH = NO
+
+CALLER_GRAPH = NO
+
+GRAPHICAL_HIERARCHY = YES
+
+DIRECTORY_GRAPH = YES
+
+DOT_IMAGE_FORMAT = png
+
+INTERACTIVE_SVG = NO
+
+DOT_PATH =
+
+DOTFILE_DIRS =
+
+MSCFILE_DIRS =
+
+DOT_GRAPH_MAX_NODES = 50
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+DOT_TRANSPARENT = NO
+
+DOT_MULTI_TARGETS = YES
+
+GENERATE_LEGEND = YES
+
+DOT_CLEANUP = YES
diff --git a/src/doxygen/DoxygenLayout.xml b/src/doxygen/DoxygenLayout.xml
new file mode 100644
index 0000000..5040ea3
--- /dev/null
+++ b/src/doxygen/DoxygenLayout.xml
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/doxygen/doxygen.css b/src/doxygen/doxygen.css
new file mode 100644
index 0000000..cee0d06
--- /dev/null
+++ b/src/doxygen/doxygen.css
@@ -0,0 +1,949 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 1.3;
+}
+
+/* @group Heading Levels */
+
+h1 {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+.fragment {
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 8px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+ border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+}
+
+.memname {
+ white-space: nowrap;
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 2px 5px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ /* opera specific markup */
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+ border-spacing: 6px 2px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+ font-family: sans-serif;
+ margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice. Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+ height: 61px;
+ background-repeat: no-repeat;
+ background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+ display: none;
+}
+*/
+
+.directory > h3 {
+ margin-top: 0;
+}
+
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory div {
+ display: none;
+ margin: 0px;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+.directory-alt > h3 {
+ margin-top: 0;
+}
+
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+
+.directory-alt img {
+ vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+}
+
+table.fieldtable {
+ width: 100%;
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ margin-left: 5px;
+ font-size: 8pt;
+ padding-left: 5px;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 7px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+ pre.fragment
+ {
+ overflow: visible;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ }
+}
+
diff --git a/src/doxygen/doxygen.mod.css b/src/doxygen/doxygen.mod.css
new file mode 100644
index 0000000..cee0d06
--- /dev/null
+++ b/src/doxygen/doxygen.mod.css
@@ -0,0 +1,949 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 1.3;
+}
+
+/* @group Heading Levels */
+
+h1 {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+.fragment {
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 8px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+ border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+}
+
+.memname {
+ white-space: nowrap;
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 2px 5px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ /* opera specific markup */
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+ border-spacing: 6px 2px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+ font-family: sans-serif;
+ margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice. Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+ height: 61px;
+ background-repeat: no-repeat;
+ background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+ display: none;
+}
+*/
+
+.directory > h3 {
+ margin-top: 0;
+}
+
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory div {
+ display: none;
+ margin: 0px;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+.directory-alt > h3 {
+ margin-top: 0;
+}
+
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+
+.directory-alt img {
+ vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+}
+
+table.fieldtable {
+ width: 100%;
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ margin-left: 5px;
+ font-size: 8pt;
+ padding-left: 5px;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 7px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+ pre.fragment
+ {
+ overflow: visible;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ }
+}
+
diff --git a/src/doxygen/footer.html b/src/doxygen/footer.html
new file mode 100644
index 0000000..d2068a5
--- /dev/null
+++ b/src/doxygen/footer.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+