Compare commits

...

72 commits

Author SHA1 Message Date
Michael Zillgith
0c09385462 - .NET API: ControlObject implements IDisposable interface 2017-10-28 15:52:49 +02:00
Michael Zillgith
5fb8c5b984 - MMS: added more length checks in parsers for file services 2017-10-28 13:13:13 +02:00
Michael Zillgith
cd8f5f483d - IED server: added new function IedServer_udpateDbposValue; added new return code for control check callback function 2017-10-26 09:32:16 +02:00
Michael Zillgith
02689d1410 - MMS server: more restrictive value type check when handling write access 2017-10-25 21:51:35 +02:00
Michael Zillgith
8a67fcc00b - fixed problem with cmake include folders 2017-10-25 18:20:22 +02:00
Michael Zillgith
e26ac787d7 - MMS client: file services -fixed encoding problem with long file names 2017-10-24 11:41:25 +02:00
Michael Zillgith
d8f964ac7c - MMS server: ACSE authenticator passes application reference (ap-title and ae-qualifier) 2017-10-19 15:09:17 +02:00
Michael Zillgith
34dff85ed6 - added missing examples 2017-10-19 09:02:29 +02:00
Michael Zillgith
53e741852e - example directory cleanup 2017-10-19 08:54:13 +02:00
Michael Zillgith
922dac1a34 - MMS: fixed potential memory leak in asn1 code that can be caused by malformed MMS messages 2017-09-28 13:23:15 +02:00
Michael Zillgith
90d910625b - MMS: asn1 parser - removed debugging code 2017-09-28 08:43:34 +02:00
Michael Zillgith
a008275f37 - MMS client: parse reject PDU
- MMS: improved BER decoder stability
2017-09-27 23:32:23 +02:00
Michael Zillgith
5b470f740c - MMS server: MMS read handler sets domain to NULL for VMD scope variable 2017-09-27 15:30:23 +02:00
Michael Zillgith
c3043290ac - MMS client: MmsConnection_getVariableAccessAttributes support for VMD specific variables 2017-09-21 21:57:01 +02:00
Michael Zillgith
e595cb7b46 - MMS client: improved error handling 2017-09-15 17:52:40 +02:00
Michael Zillgith
fe8deb9a0a - Java SCL parser: added support for "Val" elements for Octet64 types 2017-09-05 12:09:03 +02:00
Michael Zillgith
0651b94be5 - prepared for release 1.1 2017-08-25 15:15:44 +02:00
Michael Zillgith
400e8fab62 Merge branch 'master' of /home/mzillgit/github/libiec61850 2017-08-25 14:57:58 +02:00
Michael Zillgith
63510d7ee8 - socket-win32: updated WSA initialization handling 2017-08-25 14:57:06 +02:00
Michael Zillgith
17bc388ae5 - updated CHANGELOG for release 1.1.0 2017-08-25 08:31:35 +02:00
Michael Zillgith
d0ac21e487 - client/server: added set data set service (MMS write named variable list)
- client/server: improved write access to array elements and sub arrays
2017-08-25 00:02:51 +02:00
Michael Zillgith
4822a1ab7b - SV subscriber: added functions SVClientASDU_hasRefrTm and SVClientASDU_getRefrTmAsMs 2017-08-24 08:53:07 +02:00
Michael Zillgith
325867b5f4 - MMS client: replaced asn1c code in mms_client_initiate.c 2017-08-20 17:44:20 +02:00
Michael Zillgith
311c70ea30 - some code cleanup in mms_client_connection.c 2017-08-20 10:22:54 +02:00
Michael Zillgith
291d21ef9e - IEC 61850 client: Changed result strings of IedConnection_getDataDirectoryByFC. Removed appended FC string. 2017-08-19 11:24:00 +02:00
Michael Zillgith
b1641b82ff - MMS client/server: extended BER encoder to support MMS PDU sizes with more than 64k 2017-08-15 08:15:33 +02:00
Michael Zillgith
8d2b8b087e - fixed problem with windows def file when winpcap not present 2017-08-04 17:49:47 +02:00
Michael Zillgith
a0af20defc - socket_win32.c: replaced free by GLOBAL_FREEMEM 2017-07-20 17:04:00 +02:00
Michael Zillgith
180673ebfa Merge branch 'master' of github/libiec61850 2017-07-11 08:15:28 +02:00
Michael Zillgith
4b8a6ff3e7 - client API: updated function documentation 2017-07-11 08:14:22 +02:00
Michael Zillgith
b931b773eb - C# API: server - keep references to internal control handler delegates to avoid garbage collection 2017-07-05 10:44:22 +02:00
Michael Zillgith
99c0c8bc75 - added IedModel_getDeviceByInst function 2017-06-23 23:41:07 +02:00
Michael Zillgith
15ec6c7a7c - added additional check to MmsValue_update for structure size mismatch 2017-06-21 23:49:24 +02:00
Michael Zillgith
c08fe41cbb - SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime 2017-06-13 17:35:15 +02:00
Michael Zillgith
3ac4cd88df - fixed memory cleanup in GOOSE subscriber
- added GooseReceiver_isRunning function
- updated goose_subscriber example
2017-06-12 22:22:45 +02:00
mzillgith
dcbc3de0de Merge pull request #14 from cedricboudinet/master
Interface as an argument for sv_publisher_example
2017-06-10 17:49:48 +02:00
mzillgith
0282459668 Merge branch 'master' into master 2017-06-10 17:48:43 +02:00
Michael Zillgith
6badf692fe - updated client example for IEC 61850 file services 2017-05-30 11:50:30 +02:00
Michael Zillgith
2a40798f10 - server: added MmsFileAccessHandler for server side monitoring and control of file services
- file services: added support to set filestore basepath at runtime
- added IedConnection_getFileDirectoryEx to better control receiving file directories
2017-05-30 07:43:31 +02:00
Michael Zillgith
b9ba81f8a0 - added Timestamp_toMmsValue function 2017-05-17 10:33:08 +02:00
Michael Zillgith
ad98531b1b - fixed SDO bug in dynamic code generator 2017-05-15 15:44:10 +02:00
Cedric Boudinet
d33f16ca8a Allowing user to set the interface as an argument for sv_publisher_example.c 2017-05-11 10:54:02 +02:00
Michael Zillgith
8999487b24 - C server API: added function IedServer_setLocalIpAddress
- C# server API: added IedServer.SetLocalIpAddress
2017-05-05 09:03:54 +02:00
Michael Zillgith
3aa01687c5 - MMS client/server: fixed problem with negative frsmId
- some code cleanup
2017-05-04 11:07:07 +02:00
Michael Zillgith
f3b75dd3fc - added functions Timestamp_create, Timestamp_destroy, Timestamp_setByMmsUtcTime
- C# API: Added Timestamp class
- C# API: Added missing UpdateAttribute methods to IedServer
2017-04-06 22:58:22 +02:00
Michael Zillgith
69dbbcf306 - added support for Currency BasicType (mapped to visible-string-3 according to tissue 1047) 2017-04-05 09:17:58 +02:00
Michael Zillgith
463b06d3e6 - java scl tools: fixed parsing bug in OptionFields.java 2017-04-01 12:12:09 +02:00
Michael Zillgith
3126926bfd - merge master from github 2017-03-29 18:37:51 +02:00
Michael Zillgith
55d87daaef - fixed missing memory release function in example 2017-03-29 18:37:02 +02:00
Michael Zillgith
eb22cb1ed9 - merge github master branch 2017-03-29 18:34:40 +02:00
Michael Zillgith
6273a18c48 - .NET: in IedConnection: added internal reference to IsoConnectionParameters object to avoid deletion of internal AcseAuthenticationParameters by garbage collector 2017-03-29 18:26:49 +02:00
Michael Zillgith
003f1ef730 - fixed memory bugs in examples 2017-03-24 09:37:23 +01:00
mzillgith
046541700a Merge pull request #6 from cedricboudinet/master
Various patch
2017-03-20 11:03:25 +01:00
Cedric Boudinet
81cf937616 Fixing buffer overflow when printing Mms Array Value to buffer 2017-03-17 14:56:46 +01:00
Michael Zillgith
a1f442f087 - goose_subscriber_example: fix to compile with visual studio 2015 2017-03-13 11:02:35 +01:00
Michael Zillgith
3b082c2f74 - prepared for release 1.0.1 2017-03-12 21:19:24 +01:00
Michael Zillgith
877d4562e4 - COTP: fixed problem in server side src/dst reference handling 2017-03-08 19:48:59 +01:00
Michael Zillgith
c093852fda - fixed problem in client report handling when report contains no report ID 2017-03-07 17:06:24 +01:00
Cedric Boudinet
1eb14457bf Installing include files required to include sv_publisher.h 2017-03-01 21:18:21 +01:00
Michael Zillgith
9dc1a36568 - renamed README to README.md and now using markdown syntax
- added pyiec61850 tutorial and example thanks to Cédric Boudinet
2017-02-12 16:35:02 +01:00
Michael Zillgith
412e0b8da8 - applied patches for pyiec61850 2017-02-10 19:54:49 +01:00
cedric
517f1d958c Adding SV_ASDU_getSmpCnt 2017-02-09 23:56:04 +01:00
Cedric Boudinet
d95a31c628 Setting DEBUG_SV_PUBLISHER by default to 0 2017-02-16 15:47:28 +01:00
Cedric Boudinet
8432ea8a13 Forcing pythonInterp version to be the same that pythonLibs version 2017-02-13 22:37:34 +01:00
Michael Zillgith
dc4090e95d - MMS server API: added documentation for ObtainFile service callbacks 2017-01-24 14:59:15 +01:00
Michael Zillgith
e6b8e09e91 - .NET API: fixed server side bug with connection indication handler 2017-01-17 21:13:05 +01:00
Michael Zillgith
5358ef28c3 - make: added TARGET=UCLINUX-XPORT for Lantronix XPORT PRO 2017-01-12 12:00:17 +01:00
Michael Zillgith
9ad549592d - refactoring names in string_utils.h/.c
- fixed bug in StringUtils_copySubString
2017-01-12 11:48:14 +01:00
Michael Zillgith
245a21b129 - client: added function IedConnection_readInt64Value 2016-12-14 17:38:33 +01:00
Michael Zillgith
291653a38d - fixed model file and Makefile in server_example_config_file 2016-12-08 10:02:23 +01:00
Michael Zillgith
b8a4e8c7b0 - some fixes 2016-11-28 19:27:08 +01:00
Michael Zillgith
da21bb2e76 - C# wrapper: fixed bug in client readObject functions 2016-11-18 12:49:41 +01:00
206 changed files with 7573 additions and 7175 deletions

View file

@ -1,3 +1,45 @@
Changes to version 1.1.0
------------------------
- MMS client/server: added write support for named variable lists
- IEC 61850 client/server: added support for SetDataSet service
- C# API: client - added support to write data set values
- IEC 61850 client: Changed result strings of IedConnection_getDataDirectoryByFC. Removed appended FC string.
- MMS client/server: extended BER encoder to support MMS PDU sizes with more than 64k
- C# API: server - keep references to internal control handler delegates to avoid garbage collection
- IEC 61850 server: added IedModel_getDeviceByInst function
- SV subscriber: added subscriber side handling for RefrTm
- SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime
- socket-win32: updated WSA initialization handling
- all: small fixes and code optimizations
Changes to version 1.0.2
------------------------
- server: added MmsFileAccessHandler for server side monitoring and control of file services
- file services: added support to set filestore basepath at runtime
- added IedConnection_getFileDirectoryEx to better control receiving file directories
- common: added timestamp handling functions Timestamp_create, Timestamp_destroy, Timestamp_setByMmsUtcTime, Timestamp_toMmsValue
- .NET API: Added Timestamp class
- .NET API: Added missing UpdateAttribute methods to IedServer
- common: added support for Currency BasicType
- MMS file services: fixed problem with negative frsmId
- java scl tools: fixed bug with SDOs in dynamic code generator
- java scl tools: fixed parsing bug in OptionFields.java
- server: added functions to restrict local IP address IedServer_setLocalIpAddress, IedServer.SetLocalIpAddress
- .NET: IedConnection: added internal reference to IsoConnectionParameters object to avoid deletion of internal AcseAuthenticationParameters by garbage collector
Changes to version 1.0.1
------------------------
- server: fixed problem in COTP src/dst reference handling (returning zero src reference)
- client: fixed problem in report handling when RCB contains no rptID
- Python: added pyiec61850 tutorial and example thanks to Cédric Boudinet
- .NET API: fixed server side bug with connection indication handler
- added Lantronix XPORT PRO uclinux make target
- .NET API: fixed bug in client readValue functions
- .NET API: added MmsValue.GetDataAccessError() method
Changes to version 1.0.0 Changes to version 1.0.0
------------------------ ------------------------
- MMS client/server: implemented obtainFile service - MMS client/server: implemented obtainFile service

View file

@ -11,7 +11,7 @@ project(libiec61850)
ENABLE_TESTING() ENABLE_TESTING()
set(LIB_VERSION_MAJOR "1") set(LIB_VERSION_MAJOR "1")
set(LIB_VERSION_MINOR "0") set(LIB_VERSION_MINOR "1")
set(LIB_VERSION_PATCH "0") set(LIB_VERSION_PATCH "0")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/")
@ -62,7 +62,7 @@ option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF)
# DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT) # DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT)
include_directories( include_directories(
${CMAKE_CURRENT_LIST_DIR}/config ${CMAKE_CURRENT_BINARY_DIR}/config
${CMAKE_CURRENT_LIST_DIR}/src/common/inc ${CMAKE_CURRENT_LIST_DIR}/src/common/inc
${CMAKE_CURRENT_LIST_DIR}/src/goose ${CMAKE_CURRENT_LIST_DIR}/src/goose
${CMAKE_CURRENT_LIST_DIR}/src/sampled_values ${CMAKE_CURRENT_LIST_DIR}/src/sampled_values
@ -79,10 +79,13 @@ set(API_HEADERS
src/hal/inc/hal_time.h src/hal/inc/hal_time.h
src/hal/inc/hal_thread.h src/hal/inc/hal_thread.h
src/hal/inc/hal_filesystem.h src/hal/inc/hal_filesystem.h
src/hal/inc/platform_endian.h
src/common/inc/libiec61850_common_api.h src/common/inc/libiec61850_common_api.h
src/common/inc/libiec61850_platform_includes.h
src/common/inc/linked_list.h src/common/inc/linked_list.h
src/common/inc/byte_buffer.h src/common/inc/byte_buffer.h
src/common/inc/lib_memory.h src/common/inc/lib_memory.h
src/common/inc/string_utilities.h
src/iec61850/inc/iec61850_client.h src/iec61850/inc/iec61850_client.h
src/iec61850/inc/iec61850_common.h src/iec61850/inc/iec61850_common.h
src/iec61850/inc/iec61850_server.h src/iec61850/inc/iec61850_server.h
@ -108,6 +111,7 @@ set(API_HEADERS
src/sampled_values/sv_subscriber.h src/sampled_values/sv_subscriber.h
src/sampled_values/sv_publisher.h src/sampled_values/sv_publisher.h
src/logging/logging_api.h src/logging/logging_api.h
${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h
) )
IF(MSVC) IF(MSVC)
@ -136,7 +140,7 @@ INCLUDE(InstallRequiredSystemLibraries)
SET(CPACK_PACKAGE_DESCRIPTION "IEC 61850 MMS/GOOSE client and server library") 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_DESCRIPTION_SUMMARY "IEC 61850 MMS/GOOSE client and server library")
SET(CPACK_PACKAGE_VENDOR "The libIEC61850 project") SET(CPACK_PACKAGE_VENDOR "MZ Automation GmbH")
SET(CPACK_PACKAGE_CONTACT "info@libiec61850.com") SET(CPACK_PACKAGE_CONTACT "info@libiec61850.com")
SET(CPACK_PACKAGE_VERSION_MAJOR "${LIB_VERSION_MAJOR}") SET(CPACK_PACKAGE_VERSION_MAJOR "${LIB_VERSION_MAJOR}")
SET(CPACK_PACKAGE_VERSION_MINOR "${LIB_VERSION_MINOR}") SET(CPACK_PACKAGE_VERSION_MINOR "${LIB_VERSION_MINOR}")

View file

@ -1,93 +1,98 @@
README: # README libIEC61850
-------
This file is part of the documentation of libiec61850. More documentation can be found online at http://libiec61850.com or in the provided doxygen documentation. This file is part of the documentation of **libIEC61850**. More documentation can be found online at http://libiec61850.com or in the provided doxygen documentation. Also consider to review the examples to understand how to use the library
Content: Content:
- Overview
- Building and running the examples * Overview
- Installing the library and the API headers * Building and running the examples
- Building on Windows with GOOSE support * Installing the library and the API headers
- Building with the cmake build script * Building on Windows with GOOSE support
- C# client API * Building with the cmake build script
- Licensing * Using the log service with sqlite
- Third-party contributions * C# API
* Licensing
* Contributing
* Third-party contributions
Overview ## 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.
libiec61850 is an open-source (GPLv3) implementation of an IEC 61850 client and server library implementing the protocols MMS, GOOSE and SV. 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, Windows, and MacOS. 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. The library has been successfully used in many commercial software products and devices.
For commercial projects licenses and support is provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details on licensing options. For commercial projects licenses and support is provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details on licensing options.
Building and running the examples ## Building and running the examples with the provided makefiles
----------------------------------------
In the project root directoy type In the project root directoy type
> make examples ```
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. 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.: Run the sample applications in the example folders. E.g.:
> cd examples/server_example1 ```
> sudo ./server_example1 cd examples/server_example1
sudo ./server_example1
```
on the Linux command line. on the Linux command line.
You can test the server examples by using a generic client or the provided client example applications. You can test the server examples by using a generic client or the provided client example applications.
Installing the library and the API headers ## 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. 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 This can be invoked with
make install `make install`
The default install directory for the make build script is ".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.): You can modify this by setting the INSTALL_PREFIX environment variable (e.g.):
make INSTALL_PREFIX=/usr/local install `make INSTALL_PREFIX=/usr/local install`
For the cmake build script you have to provide the CMAKE_INSTALL_PREFIX variable For the cmake build script you have to provide the CMAKE_INSTALL_PREFIX variable
Building on windows with GOOSE support ## 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). To build the library and run libiec61850 applications with GOOSE support on Windows (7/8/10) 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). 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). 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) 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 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 ## Building with the cmake build script
-------------------------------------
With the help of the cmake build script it is possible to create platform independet project descriptions and let cmake create specific project or build files for other tools like Make or Visual Studio. With the help of the cmake build script it is possible to create platform 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). If you have cmake installed fire up a command line (cmd.exe) and create a new subdirectory in the libiec61850 folder. Change to this subdirectory. Then you can invoke cmake. As an command line argument you have to supply a "generator" that is used by cmake to create the project file for the actual build tool (in our case Visual Studio).
cmake -G "Visual Studio 11" .. `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 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" .. `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 (..). Note: The ".." at the end of the command line tells cmake where to find the main build script file (called CMakeLists.txt). This should point to the folder libiec61850 which is in our case the parent directory (..).
Depending on the system you don't have to provide a generator to the cmake command.
To select some configuration options you can use ccmake or cmake-gui. To select some configuration options you can use ccmake or cmake-gui.
Building the sqlite logging driver ## Using the log service with sqlite
-----------------------------------
The library provides support for the IEC 61850 log service. It provides an abstract interface for a logging database. Included is a driver for using sqlite for logging. This driver can be seen as an example on how to use the abstract logging interface.
You can use the driver by including the src/logging/drivers/sqlite/log_storage_sqlite.c file into your application build. You can use the driver by including the src/logging/drivers/sqlite/log_storage_sqlite.c file into your application build.
@ -96,25 +101,27 @@ On Ubuntu Linux (and simpilar Linux distributions) it is enough to install the s
On windows the cmake skript will detect the sqlite source code and also creates the example project for logging. On windows the cmake skript will detect the sqlite source code and also creates the example project for logging.
C# client API ## C# 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. 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.
Experimental Python bindings ## Experimental Python bindings
----------------------------
The experimental Python binding can be created using SWIG with cmake. The experimental Python binding can be created using SWIG with cmake.
To enable the bindings you have to select the phyton configuration option with ccmake of cmake-gui. To enable the bindings you have to select the phyton configuration option with ccmake of cmake-gui.
Commercial licenses ## Commercial licenses and support
-------------------
Commercial licensing and support options are provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details. Support and commercial license options are provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details.
## Contributing
If you want to contribute to the improvement and development of the library please send me comments, feature requests, bug reports, or patches. For more than trivial contributions I require you to sign a Contributor License Agreement. Please contact info@libiec61850.com.
Third-party contributions: ## 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 - The Mac OS X socket and ethernet layer has been kindly contributed by Michael Clausen, HES-SO Valais-Wallis, http://www.hevs.ch

View file

@ -24,10 +24,11 @@
#define DEBUG_GOOSE_SUBSCRIBER 0 #define DEBUG_GOOSE_SUBSCRIBER 0
#define DEBUG_GOOSE_PUBLISHER 0 #define DEBUG_GOOSE_PUBLISHER 0
#define DEBUG_SV_SUBSCRIBER 0 #define DEBUG_SV_SUBSCRIBER 0
#define DEBUG_SV_PUBLISHER 0
#define DEBUG_HAL_ETHERNET 0 #define DEBUG_HAL_ETHERNET 0
/* Maximum MMS PDU SIZE - default is 65000 */ /* Maximum MMS PDU SIZE - default is 65000 */
#define CONFIG_MMS_MAXIMUM_PDU_SIZE 65000 #define CONFIG_MMS_MAXIMUM_PDU_SIZE 120000
/* /*
* Enable single threaded mode * Enable single threaded mode
@ -36,7 +37,7 @@
* 0 ==> server runs in multi-threaded mode (one thread for each connection and * 0 ==> server runs in multi-threaded mode (one thread for each connection and
* one server background thread ) * one server background thread )
*/ */
#define CONFIG_MMS_SINGLE_THREADED 1 #define CONFIG_MMS_SINGLE_THREADED 0
/* /*
* Optimize stack for threadless operation - don't use semaphores * Optimize stack for threadless operation - don't use semaphores
@ -223,4 +224,9 @@
/* Support user access to raw messages */ /* Support user access to raw messages */
#define CONFIG_MMS_RAW_MESSAGE_LOGGING 1 #define CONFIG_MMS_RAW_MESSAGE_LOGGING 1
/* Allow to set the virtual filestore basepath for MMS file services at runtime with the
* MmsServer_setFilestoreBasepath function
*/
#define CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME 1
#endif /* STACK_CONFIG_H_ */ #endif /* STACK_CONFIG_H_ */

View file

@ -29,6 +29,9 @@
#cmakedefine01 DEBUG_MMS_SERVER #cmakedefine01 DEBUG_MMS_SERVER
#cmakedefine01 DEBUG_GOOSE_SUBSCRIBER #cmakedefine01 DEBUG_GOOSE_SUBSCRIBER
#cmakedefine01 DEBUG_GOOSE_PUBLISHER #cmakedefine01 DEBUG_GOOSE_PUBLISHER
#cmakedefine01 DEBUG_SV_SUBSCRIBER 0
#cmakedefine01 DEBUG_SV_PUBLISHER 0
#cmakedefine01 DEBUG_HAL_ETHERNET 0
/* 1 ==> server runs in single threaded mode (one dedicated thread for the server) /* 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 * 0 ==> server runs in multi threaded mode (one thread for each connection and
@ -103,14 +106,14 @@
#define CONFIG_GOOSE_EVENT_RETRANSMISSION_COUNT 2 #define CONFIG_GOOSE_EVENT_RETRANSMISSION_COUNT 2
/* Define if GOOSE control block elements are writable (1) or read-only (0) */ /* Define if GOOSE control block elements are writable (1) or read-only (0) */
#define CONFIG_GOOSE_GOID_WRITABLE 1 #define CONFIG_GOOSE_GOID_WRITABLE 0
#define CONFIG_GOOSE_DATSET_WRITABLE 1 #define CONFIG_GOOSE_DATSET_WRITABLE 0
#define CONFIG_GOOSE_CONFREV_WRITABLE 1 #define CONFIG_GOOSE_CONFREV_WRITABLE 0
#define CONFIG_GOOSE_NDSCOM_WRITABLE 1 #define CONFIG_GOOSE_NDSCOM_WRITABLE 0
#define CONFIG_GOOSE_DSTADDRESS_WRITABLE 1 #define CONFIG_GOOSE_DSTADDRESS_WRITABLE 0
#define CONFIG_GOOSE_MINTIME_WRITABLE 1 #define CONFIG_GOOSE_MINTIME_WRITABLE 0
#define CONFIG_GOOSE_MAXTIME_WRITABLE 1 #define CONFIG_GOOSE_MAXTIME_WRITABLE 0
#define CONFIG_GOOSE_FIXEDOFFS_WRITABLE 1 #define CONFIG_GOOSE_FIXEDOFFS_WRITABLE 0
/* The default value for the priority field of the 802.1Q header (allowed range 0-7) */ /* The default value for the priority field of the 802.1Q header (allowed range 0-7) */
#define CONFIG_GOOSE_DEFAULT_PRIORITY 4 #define CONFIG_GOOSE_DEFAULT_PRIORITY 4
@ -133,6 +136,9 @@
/* include support for IEC 61850 reporting services */ /* include support for IEC 61850 reporting services */
#cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE #cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE
/* support buffered report control blocks with ResvTms field */
#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0
/* The default buffer size of buffered RCBs in bytes */ /* The default buffer size of buffered RCBs in bytes */
#cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@ #cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@
@ -194,10 +200,21 @@
#define CONFIG_IEC61850_CONTROL_SERVICE 0 #define CONFIG_IEC61850_CONTROL_SERVICE 0
#endif #endif
/* Sort getNameList response according to the MMS specified collation order - this is required by the standard
* Set to 0 only for performance reasons and when no certification is required! */
#define CONFIG_MMS_SORT_NAME_LIST 1
#define CONFIG_INCLUDE_PLATFORM_SPECIFIC_HEADERS 0
/* use short FC defines as in old API */ /* use short FC defines as in old API */
#define CONFIG_PROVIDE_OLD_FC_DEFINES 0 #define CONFIG_PROVIDE_OLD_FC_DEFINES 0
/* Support user acccess to raw messages */ /* Support user acccess to raw messages */
#cmakedefine01 CONFIG_MMS_RAW_MESSAGE_LOGGING #cmakedefine01 CONFIG_MMS_RAW_MESSAGE_LOGGING
/* Allow to set the virtual filestore basepath for MMS file services at runtime with the
* MmsServer_setFilestoreBasepath function
*/
#define CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME 1
#endif /* STACK_CONFIG_H_ */ #endif /* STACK_CONFIG_H_ */

View file

@ -2,22 +2,7 @@
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B"> <SCL xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B">
<Header id="" version="1" revision="" nameStructure="IEDName"> <Header id="" version="1" revision="" nameStructure="IEDName">
</Header> </Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="beagle" apName="accessPoint1">
<Address>
<P type="IP">10.0.0.2</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="beagle"> <IED name="beagle">
<Services> <Services>
@ -87,7 +72,12 @@
</DOI> </DOI>
</LN> </LN>
<LN lnClass="GAPC" lnType="TIM_GAPC" inst="1" prefix="TIM_" /> <LN lnClass="GAPC" lnType="TIM_GAPC" inst="1" prefix="TIM_" />
<LN lnClass="FSCH" lnType="FSCH_60S" inst="1" prefix="T60S_" />
<LN lnClass="FSCH" lnType="FSCH_60S" inst="2" prefix="T60S_" />
<LN lnClass="FSCC" lnType="FSCC" inst="1" prefix="GGIO_" />
</LDevice> </LDevice>
</Server> </Server>
@ -140,6 +130,159 @@
<DO name="OpCntRs" type="INC_OpCntRs" /> <DO name="OpCntRs" type="INC_OpCntRs" />
</LNodeType> </LNodeType>
<!-- Schedule type for 60s on/off controls -->
<LNodeType id="FSCH_60S" lnClass="FSCH">
<DO name="Beh" type="ENS_Beh" desc="Enumerated status" />
<DO name="SchdSt" type="ENS_ScheduleStateKind" desc="schedule state"/>
<DO name="SchdEntr" type="INS_0" desc="current schedule entry of the running schedule"/>
<DO name="ValSPS" type="SPS_0" desc="current value determined by the schedule" />
<DO name="VldReq" type="SPC_0" desc="validate request"/>
<DO name="EnaReq" type="SPC_0" desc="enable request"/>
<DO name="EdtReq" type="SPC_0" desc="enable request"/>
<DO name="DsaReq" type="SPC_0" desc="disable request"/>
<DO name="SchdPrio" type="ING" desc="schedule priority"/>
<DO name="NumEntr" type="ING" desc="number of valid entries"/>
<DO name="SchdIntv" type="ING" desc="the schedule interval duration in time entities as specified in the unit"/>
<DO name="ValSPG1" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG2" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG3" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG4" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG5" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG6" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG7" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG8" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG9" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG10" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG11" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG12" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG13" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG14" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG15" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG16" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG17" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG18" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG19" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG20" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG21" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG22" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG23" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG24" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG25" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG26" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG27" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG28" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG29" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG30" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG31" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG32" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG33" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG34" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG35" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG36" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG37" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG38" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG39" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG40" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG41" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG42" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG43" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG44" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG45" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG46" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG47" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG48" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG49" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG50" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG51" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG52" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG53" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG54" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG55" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG56" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG57" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG58" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG59" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="ValSPG60" type="SPG_0" desc="the SPG scheduled values (current value as SPS)"/>
<DO name="StrTm" type="TSG_0" desc="start time of the schedule in UTC time" />
<DO name="IntvPer" type="ING" desc="the periodicity interval duration in entities as specified in IntvTyp; if the value is 0, the schedule shall not be repeated periodically"/>
<DO name="IntvTyp" type="ENG_ScheduleIntervalKind" desc="interval type (units) to define the periodicity"/>
<DO name="SchdReuse" type="SPG_0" desc=""/>
</LNodeType>
<LNodeType id="FSCC" lnClass="FSCH">
<DO name="Beh" type="ENS_Beh" desc="Enumerated status" />
<DO name="ActSchdRef" type="ORS_0" desc="object reference of active schedule"/>
<DO name="CtlEnt" type="ORG_0" desc="object reference to the entity controlled by the schedule"/>
<DO name="Schd1" type="ORG_0" desc="object reference to schedule 1"/>
<DO name="Schd2" type="ORG_0" desc="object reference to schedule 2"/>
</LNodeType>
<DOType cdc="ORG" id="ORG_0">
<DA name="setSrcRef" fc="SP" dchg="true" bType="VisString129" />
</DOType>
<DOType cdc="ORS" id="ORS_0">
<DA name="stVal" fc="ST" dchg="true" bType="VisString129" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType cdc="ENS" desc="Enumerated status" id="ENS_ScheduleStateKind">
<DA bType="Enum" dchg="true" fc="ST" name="stVal" type="ScheduleStateKind" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="INS" desc="Integer status" id="INS_0">
<DA bType="INT32" dchg="true" fc="ST" name="stVal" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="SPS" desc="Single point status" id="SPS_0">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="stVal" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType id="SPC_0" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="ING" cdc="ING">
<DA name="setVal" bType="INT32" fc="SP" dchg="true" />
</DOType>
<DOType cdc="SPG" id="SPG_0">
<DA name="setVal" bType="BOOLEAN" fc="SG" dchg="true" />
</DOType>
<DOType cdc="TSG" id="TSG_0">
<DA name="setTm" bType="Timestamp" fc="SP" dchg="true" />
<DA name="setCal" bType="Struct" type="CalendarTime" fc="SP" dchg="true" />
</DOType>
<DOType id="ENG_ScheduleIntervalKind" cdc="ENG">
<DA name="setVal" bType="Enum" type="ScheduleIntervalKind" fc="SP"
dchg="true" />
</DOType>
<DOType id="ING_EXT" cdc="ING"> <DOType id="ING_EXT" cdc="ING">
<DA name="setVal" bType="INT32" fc="SP" dchg="true" /> <DA name="setVal" bType="INT32" fc="SP" dchg="true" />
<DA name="dataNs" bType="VisString255" fc="EX"> <DA name="dataNs" bType="VisString255" fc="EX">
@ -289,6 +432,17 @@
<BDA name="Test" bType="BOOLEAN" /> <BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" /> <BDA name="Check" bType="Check" />
</DAType> </DAType>
<DAType id="CalendarTime">
<BDA name="occ" bType="INT16U" />
<BDA name="occType" bType="Enum" type="OccurenceKind" />
<BDA name="occPer" bType="Enum" type="PeriodKind" />
<BDA name="weekDay" bType="Enum" type="WeekdayKind" />
<BDA name="month" bType="Enum" type="MonthKind" />
<BDA name="day" bType="INT8U" />
<BDA name="hr" bType="INT8U" />
<BDA name="mn" bType="INT8U" />
</DAType>
<EnumType id="Beh"> <EnumType id="Beh">
<EnumVal ord="1">on</EnumVal> <EnumVal ord="1">on</EnumVal>
@ -327,5 +481,66 @@
<EnumVal ord="7">maintenance</EnumVal> <EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal> <EnumVal ord="8">process</EnumVal>
</EnumType> </EnumType>
<EnumType id="ScheduleStateKind">
<EnumVal ord="1">not-ready</EnumVal>
<EnumVal ord="2">validated</EnumVal>
<EnumVal ord="3">ready</EnumVal>
<EnumVal ord="4">running</EnumVal>
</EnumType>
<EnumType id="OccurenceKind">
<EnumVal ord="0">Time</EnumVal>
<EnumVal ord="1">WeekDay</EnumVal>
<EnumVal ord="2">WeekOfYear</EnumVal>
<EnumVal ord="3">DayOfMonth</EnumVal>
<EnumVal ord="4">DayOfYear</EnumVal>
</EnumType>
<EnumType id="PeriodKind">
<EnumVal ord="0">Hour</EnumVal>
<EnumVal ord="1">Day</EnumVal>
<EnumVal ord="2">Week</EnumVal>
<EnumVal ord="3">Month</EnumVal>
<EnumVal ord="4">Year</EnumVal>
</EnumType>
<EnumType id="WeekdayKind">
<EnumVal ord="0">reserved</EnumVal>
<EnumVal ord="1">Monday</EnumVal>
<EnumVal ord="2">Tuesday</EnumVal>
<EnumVal ord="3">Wednesday</EnumVal>
<EnumVal ord="4">Thursday</EnumVal>
<EnumVal ord="5">Friday</EnumVal>
<EnumVal ord="6">Saturday</EnumVal>
<EnumVal ord="7">Sunday</EnumVal>
</EnumType>
<EnumType id="MonthKind">
<EnumVal ord="0">reserved</EnumVal>
<EnumVal ord="1">January</EnumVal>
<EnumVal ord="2">February</EnumVal>
<EnumVal ord="3">March</EnumVal>
<EnumVal ord="4">April</EnumVal>
<EnumVal ord="5">May</EnumVal>
<EnumVal ord="6">June</EnumVal>
<EnumVal ord="7">July</EnumVal>
<EnumVal ord="8">August</EnumVal>
<EnumVal ord="9">September</EnumVal>
<EnumVal ord="10">October</EnumVal>
<EnumVal ord="11">November</EnumVal>
<EnumVal ord="12">December</EnumVal>
</EnumType>
<EnumType id="ScheduleIntervalKind">
<EnumVal ord="1">MS</EnumVal>
<EnumVal ord="2">PER_CYCLE</EnumVal>
<EnumVal ord="3">CYCLE</EnumVal>
<EnumVal ord="4">DAY</EnumVal>
<EnumVal ord="5">WEEK</EnumVal>
<EnumVal ord="6">MONTH</EnumVal>
<EnumVal ord="7">YEAR</EnumVal>
<EnumVal ord="8">EXTERNAL</EnumVal>
</EnumType>
</DataTypeTemplates> </DataTypeTemplates>
</SCL> </SCL>

View file

@ -1,7 +1,7 @@
/* /*
* static_model.c * static_model.c
* *
* automatically generated from beagle_demo.icd * automatically generated from beagle_demo.iid
*/ */
#include "static_model.h" #include "static_model.h"
@ -7583,7 +7583,7 @@ ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0,
IedModel iedModel = { IedModel iedModel = {
"Template", "beagle",
&iedModel_GenericIO, &iedModel_GenericIO,
&iedModelds_GenericIO_LLN0_Events, &iedModelds_GenericIO_LLN0_Events,
&iedModel_GenericIO_LLN0_report0, &iedModel_GenericIO_LLN0_report0,

View file

@ -1,7 +1,7 @@
/* /*
* static_model.h * static_model.h
* *
* automatically generated from beagle_demo.icd * automatically generated from beagle_demo.iid
*/ */
#ifndef STATIC_MODEL_H_ #ifndef STATIC_MODEL_H_

View file

@ -104,7 +104,7 @@ namespace IEC61850
/// <summary> /// <summary>
/// Control object. /// Control object.
/// </summary> /// </summary>
public class ControlObject public class ControlObject : IDisposable
{ {
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self); private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self);
@ -183,12 +183,6 @@ namespace IEC61850
ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject); ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject);
} }
~ControlObject ()
{
if (this.controlObject != System.IntPtr.Zero)
ControlObjectClient_destroy(controlObject);
}
/// <summary> /// <summary>
/// Gets the control model. /// Gets the control model.
/// </summary> /// </summary>
@ -443,6 +437,18 @@ namespace IEC61850
this.commandTerminationHandlerParameter = parameter; this.commandTerminationHandlerParameter = parameter;
} }
protected virtual void Dispose(bool disposing) {
if (this.controlObject != System.IntPtr.Zero) {
ControlObjectClient_destroy (controlObject);
this.controlObject = System.IntPtr.Zero;
}
}
public void Dispose() {
Dispose (true);
}
} }
} }

View file

@ -1,7 +1,7 @@
/* /*
* IEC61850ClientAPI.cs * IEC61850ClientAPI.cs
* *
* Copyright 2014 Michael Zillgith * Copyright 2014-2016 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -266,6 +266,9 @@ namespace IEC61850
[DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)] [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
static extern void MmsValue_delete (IntPtr self); static extern void MmsValue_delete (IntPtr self);
[DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
static extern int MmsValue_getDataAccessError(IntPtr self);
/**************** /****************
* IedConnection * IedConnection
***************/ ***************/
@ -332,6 +335,9 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr IedConnection_readDataSetValues (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet); static extern IntPtr IedConnection_readDataSetValues (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedConnection_writeDataSetValues (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr values, out IntPtr accessResults);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr IedConnection_createDataSet (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet); static extern IntPtr IedConnection_createDataSet (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet);
@ -429,19 +435,26 @@ namespace IEC61850
IedConnection_destroy (connection); IedConnection_destroy (connection);
} }
} }
private IsoConnectionParameters isoConnectionParameters = null;
/// <summary> /// <summary>
/// Gets the connection parameters /// Gets the connection parameters
/// </summary> /// </summary>
/// <returns>The connection parameters</returns> /// <returns>The connection parameters</returns>
public IsoConnectionParameters GetConnectionParameters () public IsoConnectionParameters GetConnectionParameters ()
{ {
IntPtr mmsConnection = IedConnection_getMmsConnection(connection); if (isoConnectionParameters == null)
{
IntPtr parameters = MmsConnection_getIsoConnectionParameters(mmsConnection); IntPtr mmsConnection = IedConnection_getMmsConnection(connection);
return new IsoConnectionParameters(parameters); IntPtr parameters = MmsConnection_getIsoConnectionParameters(mmsConnection);
isoConnectionParameters = new IsoConnectionParameters(parameters);
}
return isoConnectionParameters;
} }
private void FreeHGlobaleDeleteFunction (IntPtr pointer) private void FreeHGlobaleDeleteFunction (IntPtr pointer)
@ -813,7 +826,7 @@ namespace IEC61850
return QueryLogByTime (logRef, startTimeMs, stopTimeMs, out moreFollows); return QueryLogByTime (logRef, startTimeMs, stopTimeMs, out moreFollows);
} }
/// <summary>Read the variable specification (type description of a DA or FDCO</summary> /// <summary>Read the variable specification (type description of a DA or FCDO</summary>
/// <param name="objectReference">The object reference of a DA or FCDO.</param> /// <param name="objectReference">The object reference of a DA or FCDO.</param>
/// <param name="fc">The functional constraint (FC) of the object</param> /// <param name="fc">The functional constraint (FC) of the object</param>
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
@ -838,7 +851,7 @@ namespace IEC61850
if (error != 0) if (error != 0)
throw new IedConnectionException ("Reading value failed", error); throw new IedConnectionException ("Reading value failed", error);
if (mmsValue.ToInt32 () == 0) if (mmsValue == IntPtr.Zero)
throw new IedConnectionException ("Variable not found on server", error); throw new IedConnectionException ("Variable not found on server", error);
return mmsValue; return mmsValue;
@ -856,6 +869,22 @@ namespace IEC61850
return new MmsValue (value, true); return new MmsValue (value, true);
} }
private IntPtr readObjectInternalAndCheckDataAccessError(string objectReference, FunctionalConstraint fc)
{
IntPtr mmsValue = readObjectInternal (objectReference, fc);
if (MmsValue_getType(mmsValue) == (int) MmsType.MMS_DATA_ACCESS_ERROR) {
int dataAccessError = MmsValue_getDataAccessError (mmsValue);
MmsValue_delete (mmsValue);
throw new IedConnectionException ("Data access error", dataAccessError);
}
return mmsValue;
}
/// <summary>Read the value of a basic data attribute (BDA) of type boolean.</summary> /// <summary>Read the value of a basic data attribute (BDA) of type boolean.</summary>
/// <param name="objectReference">The object reference of a BDA.</param> /// <param name="objectReference">The object reference of a BDA.</param>
/// <param name="fc">The functional constraint (FC) of the object</param> /// <param name="fc">The functional constraint (FC) of the object</param>
@ -863,12 +892,18 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public bool ReadBooleanValue (string objectReference, FunctionalConstraint fc) public bool ReadBooleanValue (string objectReference, FunctionalConstraint fc)
{ {
var mmsValue = ReadValue (objectReference, fc); IntPtr mmsValue = readObjectInternalAndCheckDataAccessError (objectReference, fc);
if (mmsValue.GetType () == MmsType.MMS_BOOLEAN) if (MmsValue_getType (mmsValue) != (int) MmsType.MMS_BOOLEAN) {
return mmsValue.GetBoolean (); MmsValue_delete (mmsValue);
else
throw new IedConnectionException ("Result is not of type boolean (MMS_BOOLEAN)", 0); throw new IedConnectionException ("Result is not of type boolean (MMS_BOOLEAN)", 0);
}
bool value = MmsValue_getBoolean (mmsValue);
MmsValue_delete (mmsValue);
return value;
} }
/// <summary>Read the value of a basic data attribute (BDA) of type float.</summary> /// <summary>Read the value of a basic data attribute (BDA) of type float.</summary>
@ -877,10 +912,12 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public float ReadFloatValue (string objectReference, FunctionalConstraint fc) public float ReadFloatValue (string objectReference, FunctionalConstraint fc)
{ {
IntPtr mmsValue = readObjectInternal (objectReference, fc); IntPtr mmsValue = readObjectInternalAndCheckDataAccessError (objectReference, fc);
if (MmsValue_getType (mmsValue) != (int)MmsType.MMS_FLOAT) if (MmsValue_getType (mmsValue) != (int)MmsType.MMS_FLOAT) {
throw new IedConnectionException ("Result is not of type float", 0); MmsValue_delete (mmsValue);
throw new IedConnectionException ("Result is not of type float (MMS_FLOAT)", 0);
}
float value = MmsValue_toFloat (mmsValue); float value = MmsValue_toFloat (mmsValue);
@ -895,7 +932,7 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public string ReadStringValue (string objectReference, FunctionalConstraint fc) public string ReadStringValue (string objectReference, FunctionalConstraint fc)
{ {
IntPtr mmsValue = readObjectInternal (objectReference, fc); IntPtr mmsValue = readObjectInternalAndCheckDataAccessError (objectReference, fc);
if (!((MmsValue_getType (mmsValue) == (int)MmsType.MMS_VISIBLE_STRING) || (MmsValue_getType (mmsValue) == (int)MmsType.MMS_STRING))) { if (!((MmsValue_getType (mmsValue) == (int)MmsType.MMS_VISIBLE_STRING) || (MmsValue_getType (mmsValue) == (int)MmsType.MMS_STRING))) {
MmsValue_delete (mmsValue); MmsValue_delete (mmsValue);
@ -917,7 +954,7 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public Quality ReadQualityValue (string objectReference, FunctionalConstraint fc) public Quality ReadQualityValue (string objectReference, FunctionalConstraint fc)
{ {
IntPtr mmsValue = readObjectInternal (objectReference, fc); IntPtr mmsValue = readObjectInternalAndCheckDataAccessError (objectReference, fc);
if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) { if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) {
int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue); int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue);
@ -936,7 +973,7 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public int ReadBitStringValue (string objectReference, FunctionalConstraint fc) public int ReadBitStringValue (string objectReference, FunctionalConstraint fc)
{ {
IntPtr mmsValue = readObjectInternal (objectReference, fc); IntPtr mmsValue = readObjectInternalAndCheckDataAccessError (objectReference, fc);
if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) { if (MmsValue_getType (mmsValue) == (int)MmsType.MMS_BIT_STRING) {
int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue); int bitStringValue = (int)MmsValue_getBitStringAsInteger (mmsValue);
@ -953,14 +990,14 @@ namespace IEC61850
/// <param name="objectReference">The object reference of a BDA.</param> /// <param name="objectReference">The object reference of a BDA.</param>
/// <param name="fc">The functional constraint (FC) of the object</param> /// <param name="fc">The functional constraint (FC) of the object</param>
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public UInt64 ReadTimestampValue (string objectReference, FunctionalConstraint fc) public Timestamp ReadTimestampValue (string objectReference, FunctionalConstraint fc)
{ {
var mmsValuePtr = readObjectInternal (objectReference, fc); var mmsValuePtr = readObjectInternalAndCheckDataAccessError (objectReference, fc);
var mmsValue = new MmsValue (mmsValuePtr, true); var mmsValue = new MmsValue (mmsValuePtr, true);
if (mmsValue.GetType () == MmsType.MMS_UTC_TIME) if (mmsValue.GetType () == MmsType.MMS_UTC_TIME)
return mmsValue.GetUtcTimeInMs (); return new Timestamp (mmsValue);
else else
throw new IedConnectionException ("Result is not of type timestamp (MMS_UTC_TIME)", 0); throw new IedConnectionException ("Result is not of type timestamp (MMS_UTC_TIME)", 0);
} }
@ -973,7 +1010,7 @@ namespace IEC61850
/// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception> /// <exception cref="IedConnectionException">This exception is thrown if there is a connection or service error</exception>
public Int64 ReadIntegerValue (string objectReference, FunctionalConstraint fc) public Int64 ReadIntegerValue (string objectReference, FunctionalConstraint fc)
{ {
var mmsValuePtr = readObjectInternal (objectReference, fc); var mmsValuePtr = readObjectInternalAndCheckDataAccessError (objectReference, fc);
var mmsValue = new MmsValue (mmsValuePtr, true); var mmsValue = new MmsValue (mmsValuePtr, true);
@ -1207,6 +1244,56 @@ namespace IEC61850
return dataSet; return dataSet;
} }
/// <summary>
/// Writes the values of a data set (SetDataSetValues service).
/// </summary>
/// <returns>The list of access results</returns>
/// <param name="dataSetReference">The object reference of the data set</param>
/// <param name="values">The new values for the data set members. The values have to be of the same number and type as the data set members</param>
public List<MmsDataAccessError> WriteDataSetValues(string dataSetReference, List<MmsValue> values)
{
int error;
IntPtr accessResults = IntPtr.Zero;
IntPtr valueList = LinkedList_create ();
foreach (MmsValue mmsValue in values) {
LinkedList_add (valueList, mmsValue.valueReference);
}
IedConnection_writeDataSetValues (connection, out error, dataSetReference, valueList, out accessResults);
LinkedList_destroyStatic (valueList);
/* handle access results */
List<MmsDataAccessError> accessResultList = null;
if (accessResults != IntPtr.Zero) {
IntPtr element = LinkedList_getNext (accessResults);
while (element != IntPtr.Zero) {
IntPtr elementData = LinkedList_getData (element);
MmsValue accessResultValue = new MmsValue (elementData, true);
MmsDataAccessError dataAccessError = accessResultValue.GetDataAccessError ();
accessResultList.Add (dataAccessError);
element = LinkedList_getNext (element);
}
LinkedList_destroyStatic (accessResults);
}
if (error != 0)
throw new IedConnectionException ("Writing data set failed", error);
return accessResultList;
}
/// <summary> /// <summary>
/// Create a new data set. /// Create a new data set.
/// </summary> /// </summary>

View file

@ -49,6 +49,27 @@ namespace IEC61850
} }
} }
/// <summary>
/// MMS data access error for MmsValue type MMS_DATA_ACCESS_ERROR
/// </summary>
public enum MmsDataAccessError {
NO_RESPONSE = -2, /* for server internal purposes only! */
SUCCESS = -1,
OBJECT_INVALIDATED = 0,
HARDWARE_FAULT = 1,
TEMPORARILY_UNAVAILABLE = 2,
OBJECT_ACCESS_DENIED = 3,
OBJECT_UNDEFINED = 4,
INVALID_ADDRESS = 5,
TYPE_UNSUPPORTED = 6,
TYPE_INCONSISTENT = 7,
OBJECT_ATTRIBUTE_INCONSISTENT = 8,
OBJECT_ACCESS_UNSUPPORTED = 9,
OBJECT_NONE_EXISTENT = 10,
OBJECT_VALUE_INVALID = 11,
UNKNOWN = 12,
}
[Flags] [Flags]
public enum TriggerOptions { public enum TriggerOptions {
NONE = 0, NONE = 0,
@ -119,6 +140,203 @@ namespace IEC61850
} }
} }
/// <summary>
/// Timestamp (represents IEC 61850 timestamps e.g. "t" attribute)
/// </summary>
public class Timestamp
{
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr Timestamp_create ();
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_destroy (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_clearFlags (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
static extern bool Timestamp_isLeapSecondKnown (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setLeapSecondKnown (IntPtr self, bool value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
static extern bool Timestamp_hasClockFailure (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setClockFailure (IntPtr self, bool value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
static extern bool Timestamp_isClockNotSynchronized (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setClockNotSynchronized (IntPtr self, bool value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern int Timestamp_getSubsecondPrecision (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setSubsecondPrecision(IntPtr self, int subsecondPrecision);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setTimeInSeconds (IntPtr self, UInt32 secondsSinceEpoch);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setTimeInMilliseconds (IntPtr self, UInt64 millisSinceEpoch);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern UInt32 Timestamp_getTimeInSeconds (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern UInt64 Timestamp_getTimeInMs (IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void Timestamp_setByMmsUtcTime (IntPtr self, IntPtr mmsValue);
internal IntPtr timestampRef = IntPtr.Zero;
private bool responsableForDeletion;
internal Timestamp(IntPtr timestampRef, bool selfAllocated)
{
this.timestampRef = timestampRef;
this.responsableForDeletion = selfAllocated;
}
public Timestamp (DateTime timestamp) : this ()
{
SetDateTime (timestamp);
}
public Timestamp (MmsValue mmsUtcTime) : this()
{
SetByMmsUtcTime (mmsUtcTime);
}
public Timestamp()
{
timestampRef = Timestamp_create ();
LeapSecondKnown = true;
responsableForDeletion = true;
}
~Timestamp ()
{
if (responsableForDeletion)
Timestamp_destroy (timestampRef);
}
public void ClearFlags()
{
Timestamp_clearFlags (timestampRef);
}
public void SetDateTime(DateTime timestamp)
{
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime timestampUTC = timestamp.ToUniversalTime();
TimeSpan timeDiff = timestampUTC - epoch;
ulong timeVal = Convert.ToUInt64(timeDiff.TotalMilliseconds);
SetTimeInMilliseconds (timeVal);
}
public bool LeapSecondKnown {
get { return IsLeapSecondKnown ();}
set { SetLeapSecondKnow (value);}
}
public bool IsLeapSecondKnown()
{
return Timestamp_isLeapSecondKnown (timestampRef);
}
public void SetLeapSecondKnow(bool value)
{
Timestamp_setLeapSecondKnown (timestampRef, value);
}
public bool ClockFailure {
get { return HasClockFailure ();}
set { SetClockFailure (value);}
}
public bool HasClockFailure()
{
return Timestamp_hasClockFailure (timestampRef);
}
public void SetClockFailure(bool value)
{
Timestamp_setClockFailure (timestampRef, value);
}
public bool ClockNotSynchronized {
get { return IsClockNotSynchronized (); }
set { SetClockNotSynchronized (value); }
}
public bool IsClockNotSynchronized() {
return Timestamp_isClockNotSynchronized(timestampRef);
}
public void SetClockNotSynchronized(bool value) {
Timestamp_setClockNotSynchronized (timestampRef, value);
}
public int SubsecondPrecision {
get { return GetSubsecondPrecision (); }
set { SetSubsecondPrecision (value); }
}
public int GetSubsecondPrecision() {
return Timestamp_getSubsecondPrecision (timestampRef);
}
public void SetSubsecondPrecision(int subsecondPrecision) {
Timestamp_setSubsecondPrecision (timestampRef, subsecondPrecision);
}
public UInt32 TimeInSeconds {
get { return GetTimeInSeconds (); }
set { SetTimeInSeconds (value); }
}
public UInt32 GetTimeInSeconds()
{
return Timestamp_getTimeInSeconds (timestampRef);
}
public void SetTimeInSeconds(UInt32 secondsSinceEpoch)
{
Timestamp_setTimeInSeconds (timestampRef, secondsSinceEpoch);
}
public UInt64 TimeInMilliseconds {
get { return GetTimeInMilliseconds (); }
set { SetTimeInMilliseconds (value); }
}
public UInt64 GetTimeInMilliseconds()
{
return Timestamp_getTimeInMs (timestampRef);
}
public void SetTimeInMilliseconds(UInt64 millisSinceEpoch) {
Timestamp_setTimeInMilliseconds (timestampRef, millisSinceEpoch);
}
public void SetByMmsUtcTime(MmsValue mmsValue)
{
Timestamp_setByMmsUtcTime (timestampRef, mmsValue.valueReference);
}
}
public enum ACSIClass public enum ACSIClass
{ {
/** data objects */ /** data objects */

View file

@ -197,24 +197,6 @@ namespace IEC61850
ACCESS_POLICY_DENY = 1 ACCESS_POLICY_DENY = 1
} }
public enum MmsDataAccessError {
DATA_ACCESS_ERROR_NO_RESPONSE = -2, /* for server internal purposes only! */
DATA_ACCESS_ERROR_SUCCESS = -1,
DATA_ACCESS_ERROR_OBJECT_INVALIDATED = 0,
DATA_ACCESS_ERROR_HARDWARE_FAULT = 1,
DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE = 2,
DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED = 3,
DATA_ACCESS_ERROR_OBJECT_UNDEFINED = 4,
DATA_ACCESS_ERROR_INVALID_ADDRESS = 5,
DATA_ACCESS_ERROR_TYPE_UNSUPPORTED = 6,
DATA_ACCESS_ERROR_TYPE_INCONSISTENT = 7,
DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT = 8,
DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED = 9,
DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT = 10,
DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID = 11,
DATA_ACCESS_ERROR_UNKNOWN = 12
}
public enum DataAttributeType { public enum DataAttributeType {
BOOLEAN = 0, BOOLEAN = 0,
INT8 = 1, INT8 = 1,
@ -245,7 +227,8 @@ namespace IEC61850
GENERIC_BITSTRING = 26, GENERIC_BITSTRING = 26,
CONSTRUCTED = 27, CONSTRUCTED = 27,
ENTRY_TIME = 28, ENTRY_TIME = 28,
PHYCOMADDR = 29 PHYCOMADDR = 29,
CURRENCY = 30
} }
public enum ModeValues public enum ModeValues
@ -264,7 +247,12 @@ namespace IEC61850
ALARM = 3 ALARM = 3
} }
public class CDC { /// <summary>
/// The CDC class contains helper functions to create DataObject instances for the
/// most common Common Data Classes.
/// </summary>
public class CDC
{
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr CDC_SPS_create(string name, IntPtr parent, uint options); static extern IntPtr CDC_SPS_create(string name, IntPtr parent, uint options);
@ -573,6 +561,9 @@ namespace IEC61850
[DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)] [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr IedServer_create(IntPtr modelRef); static extern IntPtr IedServer_create(IntPtr modelRef);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_setLocalIpAddress(IntPtr self, string localIpAddress);
[DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)] [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
static extern void IedServer_start(IntPtr self, int tcpPort); static extern void IedServer_start(IntPtr self, int tcpPort);
@ -591,12 +582,18 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_unlockDataModel(IntPtr self); static extern void IedServer_unlockDataModel(IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateAttributeValue(IntPtr self, IntPtr DataAttribute, IntPtr MmsValue);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateBooleanAttributeValue(IntPtr self, IntPtr dataAttribute, bool value); static extern void IedServer_updateBooleanAttributeValue(IntPtr self, IntPtr dataAttribute, bool value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateInt32AttributeValue(IntPtr self, IntPtr dataAttribute, int value); static extern void IedServer_updateInt32AttributeValue(IntPtr self, IntPtr dataAttribute, int value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateInt64AttributeValue(IntPtr self, IntPtr dataAttribute, Int64 value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateFloatAttributeValue(IntPtr self, IntPtr dataAttribute, float value); static extern void IedServer_updateFloatAttributeValue(IntPtr self, IntPtr dataAttribute, float value);
@ -606,6 +603,9 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateUTCTimeAttributeValue(IntPtr self, IntPtr dataAttribute, ulong value); static extern void IedServer_updateUTCTimeAttributeValue(IntPtr self, IntPtr dataAttribute, ulong value);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateTimestampAttributeValue(IntPtr self, IntPtr dataAttribute, IntPtr timestamp);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_updateQuality(IntPtr self, IntPtr dataAttribute, ushort value); static extern void IedServer_updateQuality(IntPtr self, IntPtr dataAttribute, ushort value);
@ -659,7 +659,9 @@ namespace IEC61850
private IntPtr self = IntPtr.Zero; private IntPtr self = IntPtr.Zero;
private InternalControlHandler internalControlHandlerRef = null;
private InternalControlPerformCheckHandler internalControlPerformCheckHandlerRef = null;
private InternalControlWaitForExecutionHandler internalControlWaitForExecutionHandlerRef = null;
private class ControlHandlerInfo { private class ControlHandlerInfo {
public DataObject controlObject = null; public DataObject controlObject = null;
@ -797,11 +799,36 @@ namespace IEC61850
// } // }
//} //}
private InternalConnectionHandler internalConnectionHandler = null;
/// <summary>
/// Sets the local ip address for listening
/// </summary>
/// <param name="localIpAddress">Local IP address.</param>
public void SetLocalIpAddress(string localIpAddress)
{
IedServer_setLocalIpAddress (self, localIpAddress);
}
/// <summary>
/// Start MMS server
/// </summary>
/// <param name="localIpAddress">Local IP address.</param>
/// <param name="tcpPort">TCP port to use</param>
public void Start(string localIpAddress, int tcpPort)
{
SetLocalIpAddress (localIpAddress);
Start (tcpPort);
}
/// <summary>Start MMS server</summary> /// <summary>Start MMS server</summary>
/// <param name="tcpPort">TCP port to use</param>
public void Start(int tcpPort) public void Start(int tcpPort)
{ {
IedServer_setConnectionIndicationHandler (self, connectionIndicationHandler, IntPtr.Zero); if (internalConnectionHandler == null)
internalConnectionHandler = new InternalConnectionHandler (connectionIndicationHandler);
IedServer_setConnectionIndicationHandler (self, internalConnectionHandler, IntPtr.Zero);
IedServer_start(self, tcpPort); IedServer_start(self, tcpPort);
} }
@ -819,6 +846,7 @@ namespace IEC61850
public void Stop() public void Stop()
{ {
IedServer_stop(self); IedServer_stop(self);
internalConnectionHandler = null;
} }
/// <summary> /// <summary>
@ -829,6 +857,7 @@ namespace IEC61850
{ {
IedServer_destroy(self); IedServer_destroy(self);
self = IntPtr.Zero; self = IntPtr.Zero;
internalConnectionHandler = null;
} }
public bool IsRunning() public bool IsRunning()
@ -857,7 +886,10 @@ namespace IEC61850
info.controlHandler = handler; info.controlHandler = handler;
info.controlHandlerParameter = parameter; info.controlHandlerParameter = parameter;
IedServer_setControlHandler(self, controlObject.self, internalControlHandler, GCHandle.ToIntPtr(info.handle)); if (internalControlHandlerRef == null)
internalControlHandlerRef = new InternalControlHandler (internalControlHandler);
IedServer_setControlHandler(self, controlObject.self, internalControlHandlerRef, GCHandle.ToIntPtr(info.handle));
} }
public void SetCheckHandler (DataObject controlObject, CheckHandler handler, object parameter) public void SetCheckHandler (DataObject controlObject, CheckHandler handler, object parameter)
@ -867,7 +899,10 @@ namespace IEC61850
info.checkHandler = handler; info.checkHandler = handler;
info.checkHandlerParameter = parameter; info.checkHandlerParameter = parameter;
IedServer_setPerformCheckHandler(self, controlObject.self, internalCheckHandler, GCHandle.ToIntPtr(info.handle)); if (internalControlPerformCheckHandlerRef == null)
internalControlPerformCheckHandlerRef = new InternalControlPerformCheckHandler (internalCheckHandler);
IedServer_setPerformCheckHandler(self, controlObject.self, internalControlPerformCheckHandlerRef, GCHandle.ToIntPtr(info.handle));
} }
public void SetWaitForExecutionHandler (DataObject controlObject, ControlWaitForExecutionHandler handler, object parameter) public void SetWaitForExecutionHandler (DataObject controlObject, ControlWaitForExecutionHandler handler, object parameter)
@ -877,7 +912,10 @@ namespace IEC61850
info.waitForExecHandler = handler; info.waitForExecHandler = handler;
info.waitForExecHandlerParameter = parameter; info.waitForExecHandlerParameter = parameter;
IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandler, GCHandle.ToIntPtr(info.handle)); if (internalControlWaitForExecutionHandlerRef == null)
internalControlWaitForExecutionHandlerRef = new InternalControlWaitForExecutionHandler (internalControlWaitForExecutionHandler);
IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandlerRef, GCHandle.ToIntPtr(info.handle));
} }
public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter) public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter)
@ -904,24 +942,34 @@ namespace IEC61850
IedServer_unlockDataModel(self); IedServer_unlockDataModel(self);
} }
public void UpdateBooleanAttributeValue(DataAttribute dataAttr, bool val) public void UpdateAttributeValue(DataAttribute dataAttr, MmsValue value)
{ {
IedServer_updateBooleanAttributeValue(self, dataAttr.self, val); IedServer_updateAttributeValue (self, dataAttr.self, value.valueReference);
} }
public void UpdateFloatAttributeValue(DataAttribute dataAttr, float val) public void UpdateBooleanAttributeValue(DataAttribute dataAttr, bool value)
{ {
IedServer_updateFloatAttributeValue(self, dataAttr.self, val); IedServer_updateBooleanAttributeValue(self, dataAttr.self, value);
} }
public void UpdateInt32AttributeValue(DataAttribute dataAttr, int val) public void UpdateFloatAttributeValue(DataAttribute dataAttr, float value)
{ {
IedServer_updateInt32AttributeValue(self, dataAttr.self, val); IedServer_updateFloatAttributeValue(self, dataAttr.self, value);
} }
public void UpdateVisibleStringAttributeValue(DataAttribute dataAttr, string val) public void UpdateInt32AttributeValue(DataAttribute dataAttr, int value)
{ {
IedServer_updateVisibleStringAttributeValue(self, dataAttr.self, val); IedServer_updateInt32AttributeValue(self, dataAttr.self, value);
}
public void UpdateInt64AttributeValue(DataAttribute dataAttr, Int64 value)
{
IedServer_updateInt64AttributeValue (self, dataAttr.self, value);
}
public void UpdateVisibleStringAttributeValue(DataAttribute dataAttr, string value)
{
IedServer_updateVisibleStringAttributeValue(self, dataAttr.self, value);
} }
public void UpdateUTCTimeAttributeValue(DataAttribute dataAttr, DateTime timestamp) public void UpdateUTCTimeAttributeValue(DataAttribute dataAttr, DateTime timestamp)
@ -935,6 +983,11 @@ namespace IEC61850
IedServer_updateUTCTimeAttributeValue(self, dataAttr.self, timeVal); IedServer_updateUTCTimeAttributeValue(self, dataAttr.self, timeVal);
} }
public void UpdateTimestampAttributeValue(DataAttribute dataAttr, Timestamp timestamp)
{
IedServer_updateTimestampAttributeValue (self, dataAttr.self, timestamp.timestampRef);
}
public void UpdateQuality(DataAttribute dataAttr, ushort value) public void UpdateQuality(DataAttribute dataAttr, ushort value)
{ {
IedServer_updateQuality(self, dataAttr.self, value); IedServer_updateQuality(self, dataAttr.self, value);

View file

@ -102,8 +102,6 @@ namespace IEC61850
{ {
if (authParameter != IntPtr.Zero) if (authParameter != IntPtr.Zero)
AcseAuthenticationParameter_destroy(authParameter); AcseAuthenticationParameter_destroy(authParameter);
//IsoConnectionParameters_destroy(self);
} }
/// <summary> /// <summary>

View file

@ -164,6 +164,9 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern ulong MmsValue_getBinaryTimeAsUtcMs (IntPtr self); static extern ulong MmsValue_getBinaryTimeAsUtcMs (IntPtr self);
[DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)]
static extern int MmsValue_getDataAccessError(IntPtr self);
internal IntPtr valueReference; /* reference to native MmsValue instance */ internal IntPtr valueReference; /* reference to native MmsValue instance */
private bool responsableForDeletion; /* if .NET wrapper is responsable for the deletion of the native MmsValue instance */ private bool responsableForDeletion; /* if .NET wrapper is responsable for the deletion of the native MmsValue instance */
@ -174,8 +177,7 @@ namespace IEC61850
valueReference = value; valueReference = value;
this.responsableForDeletion = false; this.responsableForDeletion = false;
} }
// TODO make internal
internal MmsValue (IntPtr value, bool responsableForDeletion) internal MmsValue (IntPtr value, bool responsableForDeletion)
{ {
valueReference = value; valueReference = value;
@ -425,6 +427,14 @@ namespace IEC61850
throw new MmsValueException ("Value is of wrong type"); throw new MmsValueException ("Value is of wrong type");
} }
public MmsDataAccessError GetDataAccessError ()
{
int errorCode = MmsValue_getDataAccessError (valueReference);
return (MmsDataAccessError)errorCode;
}
/// <summary> /// <summary>
/// Gets the timestamp value as UTC time in s (UNIX time stamp). /// Gets the timestamp value as UTC time in s (UNIX time stamp).
/// </summary> /// </summary>

View file

@ -21,7 +21,6 @@ namespace authenticate
Console.WriteLine("Connect to " + hostname); Console.WriteLine("Connect to " + hostname);
try try
{ {
IsoConnectionParameters parameters = con.GetConnectionParameters(); IsoConnectionParameters parameters = con.GetConnectionParameters();

View file

@ -86,7 +86,10 @@ namespace control
Thread.Sleep(1000); Thread.Sleep(1000);
} }
con.Abort(); // has to be called before IedConnection dispose method!
control.Dispose();
con.Abort();
} }
catch (IedConnectionException e) catch (IedConnectionException e)
{ {

View file

@ -17,14 +17,19 @@ namespace example1
if (args.Length > 0) if (args.Length > 0)
hostname = args[0]; hostname = args[0];
else else
hostname = "10.0.2.2"; hostname = "127.0.0.1";
int port = 102;
if (args.Length > 1)
port = Int32.Parse(args [1]);
Console.WriteLine("Connect to " + hostname); Console.WriteLine("Connect to " + hostname);
try try
{ {
con.Connect(hostname, 102); con.Connect(hostname, port);
List<string> serverDirectory = con.GetServerDirectory(false); List<string> serverDirectory = con.GetServerDirectory(false);

View file

@ -93,8 +93,6 @@ namespace reporting
rcb1.SetIntgPd(5000); rcb1.SetIntgPd(5000);
rcb1.SetRptEna(true); rcb1.SetRptEna(true);
rcb1.SetRCBValues();
rcb2.GetRCBValues(); rcb2.GetRCBValues();
if (rcb2.IsBuffered()) if (rcb2.IsBuffered())

View file

@ -42,8 +42,20 @@ namespace server1
iedServer.Start (102); iedServer.Start (102);
Console.WriteLine ("Server started"); Console.WriteLine ("Server started");
GC.Collect ();
DataObject ggio1AnIn1 = (DataObject)iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.AnIn1");
DataAttribute ggio1AnIn1magF = (DataAttribute)ggio1AnIn1.GetChild ("mag.f");
DataAttribute ggio1AnIn1T = (DataAttribute)ggio1AnIn1.GetChild ("t");
float floatVal = 1.0f;
while (running) { while (running) {
Thread.Sleep (1); floatVal += 1f;
iedServer.UpdateTimestampAttributeValue (ggio1AnIn1T, new Timestamp (DateTime.Now));
iedServer.UpdateFloatAttributeValue (ggio1AnIn1magF, floatVal);
Thread.Sleep (100);
} }
iedServer.Stop (); iedServer.Stop ();

View file

@ -105,6 +105,30 @@ namespace tests
Assert.AreEqual (val.ToFloat (), (float)0.1234); Assert.AreEqual (val.ToFloat (), (float)0.1234);
} }
[Test ()]
public void Timestamps()
{
Timestamp timestamp = new Timestamp ();
Assert.IsTrue (timestamp.LeapSecondKnown);
Assert.IsFalse (timestamp.ClockFailure);
Assert.IsFalse (timestamp.ClockNotSynchronized);
timestamp.LeapSecondKnown = false;
Assert.IsFalse (timestamp.LeapSecondKnown);
timestamp.ClockFailure = true;
Assert.IsTrue (timestamp.ClockFailure);
timestamp.ClockNotSynchronized = true;
Assert.IsTrue (timestamp.ClockNotSynchronized);
Assert.AreEqual (0, timestamp.SubsecondPrecision);
timestamp.SubsecondPrecision = 10;
Assert.AreEqual (10, timestamp.SubsecondPrecision);
}
[Test ()] [Test ()]
public void CreateModelFromNonExistingFile() public void CreateModelFromNonExistingFile()
{ {
@ -165,6 +189,30 @@ namespace tests
iedServer.Destroy (); iedServer.Destroy ();
} }
[Test ()]
public void ReadNonExistingObject()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
IedServer iedServer = new IedServer (iedModel);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
MmsValue value = connection.ReadValue ("simpleIOGenericIO/GGIO1.SPCSO1.stVal", FunctionalConstraint.MX);
Assert.IsNotNull (value);
Assert.AreEqual (MmsType.MMS_DATA_ACCESS_ERROR, value.GetType ());
iedServer.Stop ();
iedServer.Destroy ();
}
[Test ()] [Test ()]
public void AccessDataModelServerSide() public void AccessDataModelServerSide()
{ {
@ -233,14 +281,14 @@ namespace tests
iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) { iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
opDlTmmsValue = value.ToInt32(); opDlTmmsValue = value.ToInt32();
return MmsDataAccessError.DATA_ACCESS_ERROR_SUCCESS; return MmsDataAccessError.SUCCESS;
}, null); }, null);
iedServer.HandleWriteAccess (rsDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) { iedServer.HandleWriteAccess (rsDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
if (value.ToInt32() > 1000) if (value.ToInt32() > 1000)
return MmsDataAccessError.DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; return MmsDataAccessError.OBJECT_VALUE_INVALID;
else else
return MmsDataAccessError.DATA_ACCESS_ERROR_SUCCESS; return MmsDataAccessError.SUCCESS;
}, null); }, null);
iedServer.Start (10002); iedServer.Start (10002);
@ -286,7 +334,7 @@ namespace tests
IedServer iedServer = new IedServer (iedModel); IedServer iedServer = new IedServer (iedModel);
iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) { iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
return MmsDataAccessError.DATA_ACCESS_ERROR_SUCCESS; return MmsDataAccessError.SUCCESS;
}, null); }, null);

View file

@ -1,8 +1,7 @@
add_subdirectory(server_example1) add_subdirectory(server_example_simple)
add_subdirectory(server_example2) add_subdirectory(server_example_basic_io)
add_subdirectory(server_example3) add_subdirectory(server_example_password_auth)
add_subdirectory(server_example4) add_subdirectory(server_example_write_handler)
add_subdirectory(server_example5)
add_subdirectory(server_example_control) add_subdirectory(server_example_control)
add_subdirectory(server_example_dynamic) add_subdirectory(server_example_dynamic)
add_subdirectory(server_example_config_file) add_subdirectory(server_example_config_file)
@ -11,18 +10,18 @@ add_subdirectory(server_example_threadless)
add_subdirectory(server_example_61400_25) add_subdirectory(server_example_61400_25)
add_subdirectory(server_example_setting_groups) add_subdirectory(server_example_setting_groups)
add_subdirectory(server_example_logging) add_subdirectory(server_example_logging)
add_subdirectory(server_example_files)
add_subdirectory(iec61850_client_example1) add_subdirectory(iec61850_client_example1)
add_subdirectory(iec61850_client_example2) add_subdirectory(iec61850_client_example2)
add_subdirectory(iec61850_client_example3) add_subdirectory(iec61850_client_example3)
add_subdirectory(iec61850_client_example4) add_subdirectory(iec61850_client_example4)
add_subdirectory(iec61850_client_example5) add_subdirectory(iec61850_client_example5)
IF(WIN32)
else()
add_subdirectory(iec61850_client_example_files) add_subdirectory(iec61850_client_example_files)
endif()
add_subdirectory(iec61850_client_example_reporting) add_subdirectory(iec61850_client_example_reporting)
add_subdirectory(iec61850_client_example_log) add_subdirectory(iec61850_client_example_log)
add_subdirectory(mms_client_example1)
add_subdirectory(mms_client_example2)
add_subdirectory(mms_client_example3)
add_subdirectory(mms_client_example4)
IF(WIN32) IF(WIN32)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib") if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib")

View file

@ -1,21 +1,15 @@
EXAMPLE_DIRS = mms_client_example1 EXAMPLE_DIRS = iec61850_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_example2
EXAMPLE_DIRS += iec61850_client_example3 EXAMPLE_DIRS += iec61850_client_example3
EXAMPLE_DIRS += iec61850_client_example4 EXAMPLE_DIRS += iec61850_client_example4
EXAMPLE_DIRS += iec61850_client_example5 EXAMPLE_DIRS += iec61850_client_example5
EXAMPLE_DIRS += iec61850_client_example_reporting EXAMPLE_DIRS += iec61850_client_example_reporting
EXAMPLE_DIRS += iec61850_client_example_log EXAMPLE_DIRS += iec61850_client_example_log
EXAMPLE_DIRS += server_example1 EXAMPLE_DIRS += server_example_simple
EXAMPLE_DIRS += server_example2 EXAMPLE_DIRS += server_example_basic_io
EXAMPLE_DIRS += server_example3 EXAMPLE_DIRS += server_example_password_auth
EXAMPLE_DIRS += server_example4 EXAMPLE_DIRS += server_example_write_handler
EXAMPLE_DIRS += server_example5
EXAMPLE_DIRS += server_example_goose EXAMPLE_DIRS += server_example_goose
EXAMPLE_DIRS += server_example_control EXAMPLE_DIRS += server_example_control
EXAMPLE_DIRS += server_example_config_file EXAMPLE_DIRS += server_example_config_file
@ -25,6 +19,7 @@ EXAMPLE_DIRS += server_example_61400_25
EXAMPLE_DIRS += server_example_threadless EXAMPLE_DIRS += server_example_threadless
EXAMPLE_DIRS += server_example_setting_groups EXAMPLE_DIRS += server_example_setting_groups
EXAMPLE_DIRS += server_example_logging EXAMPLE_DIRS += server_example_logging
EXAMPLE_DIRS += server_example_files
EXAMPLE_DIRS += goose_subscriber EXAMPLE_DIRS += goose_subscriber
EXAMPLE_DIRS += goose_publisher EXAMPLE_DIRS += goose_publisher
EXAMPLE_DIRS += sv_subscriber EXAMPLE_DIRS += sv_subscriber
@ -34,11 +29,10 @@ EXAMPLE_DIRS += iec61850_sv_client_example
EXAMPLE_DIRS += sv_publisher EXAMPLE_DIRS += sv_publisher
EXAMPLE_DIRS += sv_subscriber EXAMPLE_DIRS += sv_subscriber
MODEL_DIRS += server_example1 MODEL_DIRS += server_example_simple
MODEL_DIRS += server_example2 MODEL_DIRS += server_example_basic_io
MODEL_DIRS += server_example3 MODEL_DIRS += server_example_password_auth
MODEL_DIRS += server_example4 MODEL_DIRS += server_example_write_handler
MODEL_DIRS += server_example5
MODEL_DIRS += server_example_goose MODEL_DIRS += server_example_goose
MODEL_DIRS += server_example_control MODEL_DIRS += server_example_control
MODEL_DIRS += server_example_config_file MODEL_DIRS += server_example_config_file
@ -47,6 +41,7 @@ MODEL_DIRS += server_example_61400_25
MODEL_DIRS += server_example_threadless MODEL_DIRS += server_example_threadless
MODEL_DIRS += server_example_setting_groups MODEL_DIRS += server_example_setting_groups
MODEL_DIRS += server_example_logging MODEL_DIRS += server_example_logging
MODEL_DIRS += server_example_files
MODEL_DIRS += iec61850_9_2_LE_example MODEL_DIRS += iec61850_9_2_LE_example
all: examples all: examples

View file

@ -12,7 +12,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include <inttypes.h>
static int running = 1; static int running = 1;
@ -28,7 +27,10 @@ gooseListener(GooseSubscriber subscriber, void* parameter)
printf(" stNum: %u sqNum: %u\n", GooseSubscriber_getStNum(subscriber), printf(" stNum: %u sqNum: %u\n", GooseSubscriber_getStNum(subscriber),
GooseSubscriber_getSqNum(subscriber)); GooseSubscriber_getSqNum(subscriber));
printf(" timeToLive: %u\n", GooseSubscriber_getTimeAllowedToLive(subscriber)); printf(" timeToLive: %u\n", GooseSubscriber_getTimeAllowedToLive(subscriber));
printf(" timestamp: %"PRIu64"\n", GooseSubscriber_getTimestamp(subscriber));
uint64_t timestamp = GooseSubscriber_getTimestamp(subscriber);
printf(" timestamp: %u.%u\n", (uint32_t) (timestamp / 1000), (uint32_t) (timestamp % 1000));
MmsValue* values = GooseSubscriber_getDataSetValues(subscriber); MmsValue* values = GooseSubscriber_getDataSetValues(subscriber);
@ -42,14 +44,6 @@ gooseListener(GooseSubscriber subscriber, void* parameter)
int int
main(int argc, char** argv) 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(); GooseReceiver receiver = GooseReceiver_create();
if (argc > 1) { if (argc > 1) {
@ -77,5 +71,7 @@ main(int argc, char** argv)
Thread_sleep(100); Thread_sleep(100);
} }
GooseSubscriber_destroy(subscriber); GooseReceiver_stop(receiver);
GooseReceiver_destroy(receiver);
} }

View file

@ -0,0 +1,9 @@
The default ethernet interface is eth0. You can specify another interface at the command line.
./sv_9_2LE_example eth1
In order for the SV publisher to start the SVCB has to be enabled by an MMS client.

View file

@ -36,7 +36,7 @@
extern IedModel iedModel; extern IedModel iedModel;
static int running = 0; static int running = 0;
static int svcbEnabled = 0; static int svcbEnabled = 1;
void sigint_handler(int signalId) void sigint_handler(int signalId)
{ {
@ -57,9 +57,9 @@ static SampledValuesPublisher svPublisher;
static SV_ASDU asdu; static SV_ASDU asdu;
static void static void
setupSVPublisher() setupSVPublisher(const char* svInterface)
{ {
svPublisher = SampledValuesPublisher_create("eth1"); svPublisher = SampledValuesPublisher_create(NULL, svInterface);
asdu = SampledValuesPublisher_addASDU(svPublisher, "xxxxMUnn01", NULL, 1); asdu = SampledValuesPublisher_addASDU(svPublisher, "xxxxMUnn01", NULL, 1);
@ -87,6 +87,13 @@ static void sVCBEventHandler (SVControlBlock* svcb, int event, void* parameter)
int int
main(int argc, char** argv) main(int argc, char** argv)
{ {
char* svInterface;
if (argc > 1)
svInterface = argv[1];
else
svInterface = "eth0";
IedServer iedServer = IedServer_create(&iedModel); IedServer iedServer = IedServer_create(&iedModel);
/* MMS server will be instructed to start listening to client connections. */ /* MMS server will be instructed to start listening to client connections. */
@ -102,7 +109,7 @@ main(int argc, char** argv)
signal(SIGINT, sigint_handler); signal(SIGINT, sigint_handler);
setupSVPublisher(); setupSVPublisher(svInterface);
int voltage = 1; int voltage = 1;
int current = 1; int current = 1;

View file

@ -50,6 +50,8 @@ int main(int argc, char** argv) {
if (error == IED_ERROR_OK) { if (error == IED_ERROR_OK) {
IedConnection_getServerDirectory(con, &error, false);
/* read an analog measurement value from server */ /* read an analog measurement value from server */
MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX); MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX);
@ -65,8 +67,8 @@ int main(int argc, char** argv) {
if (error != IED_ERROR_OK) if (error != IED_ERROR_OK)
printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n"); printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n");
else
MmsValue_delete(value); MmsValue_delete(value);
/* read data set */ /* read data set */
@ -117,6 +119,8 @@ int main(int argc, char** argv) {
ClientDataSet_destroy(clientDataSet); ClientDataSet_destroy(clientDataSet);
ClientReportControlBlock_destroy(rcb);
close_connection: close_connection:
IedConnection_close(con); IedConnection_close(con);

View file

@ -42,8 +42,9 @@ printDataDirectory(char* doRef, IedConnection con, int spaces)
sprintf(daRef, "%s.%s", doRef, daName); sprintf(daRef, "%s.%s", doRef, daName);
printDataDirectory(daRef, con, spaces + 2); printDataDirectory(daRef, con, spaces + 2);
} }
} }
LinkedList_destroy(dataAttributes);
} }
int int
@ -145,6 +146,8 @@ main(int argc, char** argv)
dataSetMemberRef = LinkedList_getNext(dataSetMemberRef); dataSetMemberRef = LinkedList_getNext(dataSetMemberRef);
} }
LinkedList_destroy(dataSetMembers);
dataSet = LinkedList_getNext(dataSet); dataSet = LinkedList_getNext(dataSet);
} }

View file

@ -14,8 +14,9 @@
#include "hal_thread.h" #include "hal_thread.h"
int main(int argc, char** argv) { int
main(int argc, char** argv)
{
char* hostname; char* hostname;
int tcpPort = 102; int tcpPort = 102;
@ -46,25 +47,22 @@ int main(int argc, char** argv) {
/* use this to skip AP-Title completely - this may be required by some "obscure" servers */ /* use this to skip AP-Title completely - this may be required by some "obscure" servers */
// IsoConnectionParameters_setRemoteApTitle(parameters, NULL, 0); // IsoConnectionParameters_setRemoteApTitle(parameters, NULL, 0);
// IsoConnectionParameters_setLocalApTitle(parameters, NULL, 0); // IsoConnectionParameters_setLocalApTitle(parameters, NULL, 0);
TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } };
TSelector remoteTSelector = { 2, { 0x00, 0x01 } };
TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } }; SSelector sSelector1 = { 2, { 0, 1 } };
TSelector remoteTSelector = { 2, { 0x00, 0x01 } }; SSelector sSelector2 = { 5, { 0, 1, 2, 3, 4 } };
SSelector sSelector1 = {2, { 0, 1 } };
SSelector sSelector2 = {5, { 0, 1, 2, 3, 4 } };
/* change parameters for presentation, session and transport layers */ /* change parameters for presentation, session and transport layers */
IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, sSelector1, localTSelector); IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, sSelector1, localTSelector);
IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, sSelector2 , remoteTSelector); IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, sSelector2, remoteTSelector);
char* password = "top secret"; char* password = "top secret";
/* use authentication */ /* use authentication */
AcseAuthenticationParameter auth = (AcseAuthenticationParameter) calloc(1, sizeof(struct sAcseAuthenticationParameter)); AcseAuthenticationParameter auth = AcseAuthenticationParameter_create();
auth->mechanism = ACSE_AUTH_PASSWORD; AcseAuthenticationParameter_setAuthMechanism(auth, ACSE_AUTH_PASSWORD);
auth->value.password.octetString = (uint8_t*) password; AcseAuthenticationParameter_setPassword(auth, password);
auth->value.password.passwordLength = strlen(password);
IsoConnectionParameters_setAcseAuthenticationParameter(parameters, auth); IsoConnectionParameters_setAcseAuthenticationParameter(parameters, auth);
@ -84,6 +82,8 @@ int main(int argc, char** argv) {
} }
IedConnection_destroy(con); IedConnection_destroy(con);
AcseAuthenticationParameter_destroy(auth);
} }

View file

@ -1,6 +1,6 @@
set(iec61850_client_example_files_SRCS set(iec61850_client_example_files_SRCS
client_example_files.c file-tool.c
) )
IF(MSVC) IF(MSVC)
@ -8,10 +8,10 @@ set_source_files_properties(${iec61850_client_example_files_SRCS}
PROPERTIES LANGUAGE CXX) PROPERTIES LANGUAGE CXX)
ENDIF(MSVC) ENDIF(MSVC)
add_executable(iec61850_client_example_files add_executable(file-tool
${iec61850_client_example_files_SRCS} ${iec61850_client_example_files_SRCS}
) )
target_link_libraries(iec61850_client_example_files target_link_libraries(file-tool
iec61850 iec61850
) )

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = client_example_files PROJECT_BINARY_NAME = file-tool
PROJECT_SOURCES = client_example_files.c PROJECT_SOURCES = file-tool.c
include $(LIBIEC_HOME)/make/target_system.mk include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk include $(LIBIEC_HOME)/make/stack_includes.mk

View file

@ -1,108 +0,0 @@
/*
* client_example_files.c
*
* This example demonstrates the usage of the file services
*
* - How to browse the file system of the server
* - How to download a file from the server
*
* Note: intended to be used with server_example3
*
*/
#include "iec61850_client.h"
#include <stdlib.h>
#include <stdio.h>
#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();
MmsConnection mmsCon = IedConnection_getMmsConnection(con);
MmsConnection_setLocalDetail(mmsCon, 800);
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);
}

View file

@ -0,0 +1,263 @@
/*
* file-tool.c
*
* This example demonstrates the usage of the file services
*
* - How to browse the file system of the server
* - How to download a file from the server
*
* Note: intended to be used with server_example3 or server_example_files
*
* Note: DOES NOT WORK WITH VISUAL STUDIO because of libgen.h
*
*/
#include "iec61850_client.h"
#include <stdlib.h>
#include <stdio.h>
#include <libgen.h>
static char* hostname = "localhost";
static int tcpPort = 102;
static char* filename = NULL;
typedef enum {
FileOperationType_None = 0,
FileOperationType_Dir,
FileOperationType_Info,
FileOperationType_Del,
FileOperationType_Get,
FileOperationType_Set
} FileOperationType;
static FileOperationType operation = FileOperationType_None;
static bool
downloadHandler(void* parameter, uint8_t* buffer, uint32_t bytesRead)
{
FILE* fp = (FILE*) parameter;
printf("received %i bytes\n", bytesRead);
if (fwrite(buffer, bytesRead, 1, fp) == 1)
return true;
else {
printf("Failed to write local file!\n");
return false;
}
}
static void
printHelp()
{
printf("file-tool [options] <operation> [<parameters>]\n");
printf(" Options:\n");
printf(" -h <hostname/IP>\n");
printf(" -p portnumber\n");
printf(" Operations\n");
printf(" dir - show directory\n");
printf(" info <filename> - show file info\n");
printf(" del <filename> - delete file\n");
printf(" get <filename> - get file\n");
printf(" set <filename> - set file\n");
}
static int
parseOptions(int argc, char** argv)
{
int currentArgc = 1;
int retVal = 0;
while (currentArgc < argc) {
if (strcmp(argv[currentArgc], "-h") == 0) {
hostname = argv[++currentArgc];
}
else if (strcmp(argv[currentArgc], "-p") == 0) {
tcpPort = atoi(argv[++currentArgc]);
}
else if (strcmp(argv[currentArgc], "del") == 0) {
operation = FileOperationType_Del;
filename = argv[++currentArgc];
}
else if (strcmp(argv[currentArgc], "dir") == 0) {
operation = FileOperationType_Dir;
}
else if (strcmp(argv[currentArgc], "info") == 0) {
operation = FileOperationType_Info;
filename = argv[++currentArgc];
}
else if (strcmp(argv[currentArgc], "get") == 0) {
operation = FileOperationType_Get;
filename = argv[++currentArgc];
}
else if (strcmp(argv[currentArgc], "set") == 0) {
operation = FileOperationType_Set;
filename = argv[++currentArgc];
}
else {
printf("Unknown operation!\n");
return 1;
}
currentArgc++;
}
return retVal;
}
void
showDirectory(IedConnection con)
{
IedClientError error;
/* Get the root directory */
LinkedList rootDirectory =
IedConnection_getFileDirectory(con, &error, NULL);
if (error != IED_ERROR_OK) {
printf("Error retrieving file directory\n");
}
else {
LinkedList directoryEntry = LinkedList_getNext(rootDirectory);
while (directoryEntry != NULL) {
FileDirectoryEntry entry = (FileDirectoryEntry) directoryEntry->data;
printf("%s %i\n", FileDirectoryEntry_getFileName(entry), FileDirectoryEntry_getFileSize(entry));
directoryEntry = LinkedList_getNext(directoryEntry);
}
LinkedList_destroyDeep(rootDirectory, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy);
}
}
void
getFile(IedConnection con)
{
IedClientError error;
char* bname = strdup(filename);
char* localFilename = basename(bname);
FILE* fp = fopen(localFilename, "w");
if (fp != NULL) {
/* Download a file from the server */
IedConnection_getFile(con, &error, filename, downloadHandler, (void*) fp);
if (error != IED_ERROR_OK)
printf("Failed to get file!\n");
fclose(fp);
}
else
printf("Failed to open file %s\n", localFilename);
free(bname);
}
void
setFile(IedConnection con)
{
IedClientError error;
char* dirc = strdup(filename);
char* basec = strdup(filename);
char* localDirName = dirname(dirc);
char* localFileName = basename(basec);
printf("local dir: %s\n", localDirName);
printf("local file: %s\n", localFileName);
/* IedConnection_setFilestoreBasepath requires the file separator at the end! */
strcpy(dirc, localDirName);
strcat(dirc, "/");
printf("filestore basepath: %s\n", dirc);
IedConnection_setFilestoreBasepath(con, dirc);
IedConnection_setFile(con, &error, localFileName, localFileName);
if (error != IED_ERROR_OK)
printf("Failed to set file! (code=%i)\n", error);
free(dirc);
free(basec);
}
void
deleteFile(IedConnection con)
{
IedClientError error;
/* Delete file at server */
IedConnection_deleteFile(con, &error, filename);
if (error != IED_ERROR_OK)
printf("Failed to delete file! (code=%i)\n", error);
}
int
main(int argc, char** argv)
{
if (argc < 2) {
printHelp();
return 0;
}
parseOptions(argc, argv);
if (operation == FileOperationType_None) {
printHelp();
return 0;
}
IedClientError error;
IedConnection con = IedConnection_create();
IedConnection_connect(con, &error, hostname, tcpPort);
if (error == IED_ERROR_OK) {
switch (operation) {
case FileOperationType_Dir:
showDirectory(con);
break;
case FileOperationType_Get:
getFile(con);
break;
case FileOperationType_Del:
deleteFile(con);
break;
case FileOperationType_Info:
break;
case FileOperationType_Set:
setFile(con);
break;
}
IedConnection_abort(con, &error);
}
else {
printf("Failed to connect to %s:%i\n", hostname, tcpPort);
}
IedConnection_destroy(con);
}

View file

@ -132,7 +132,9 @@ int main(int argc, char** argv) {
Thread_sleep(1000); Thread_sleep(1000);
IedConnection_triggerGIReport(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01"); /* Trigger GI Report */
ClientReportControlBlock_setGI(rcb, true);
IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true);
if (error != IED_ERROR_OK) { if (error != IED_ERROR_OK) {
printf("Error triggering a GI report (code: %i)\n", error); printf("Error triggering a GI report (code: %i)\n", error);

View file

@ -1,17 +0,0 @@
set(mms_client_example1_SRCS
mms_client_example1.c
)
IF(WIN32)
set_source_files_properties(${mms_client_example1_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(mms_client_example1
${mms_client_example1_SRCS}
)
target_link_libraries(mms_client_example1
iec61850
)

View file

@ -1,17 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example1
PROJECT_SOURCES = mms_client_example1.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,51 +0,0 @@
/*
* mms_client_example.c
*
* This is the most simple example. It illustrates how to create an MmsConnection
* object and connect to a MMS server.
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include <stdlib.h>
#include <stdio.h>
#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);
}

View file

@ -1,17 +0,0 @@
set(mms_client_example2_SRCS
mms_client_example2.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example2_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example2
${mms_client_example2_SRCS}
)
target_link_libraries(mms_client_example2
iec61850
)

View file

@ -1,17 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example2
PROJECT_SOURCES = mms_client_example2.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,64 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#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);
}

View file

@ -1,17 +0,0 @@
set(mms_client_example3_SRCS
mms_client_example3.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example3_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example3
${mms_client_example3_SRCS}
)
target_link_libraries(mms_client_example3
iec61850
)

View file

@ -1,17 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example3
PROJECT_SOURCES = mms_client_example3.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,41 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#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);
}

View file

@ -1,17 +0,0 @@
set(mms_client_example4_SRCS
mms_client_example4.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example4_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example4
${mms_client_example4_SRCS}
)
target_link_libraries(mms_client_example4
iec61850
)

View file

@ -1,17 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example4
PROJECT_SOURCES = mms_client_example4.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,87 +0,0 @@
/*
* mms_client_example.c
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include <stdlib.h>
#include <stdio.h>
#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);
}

View file

@ -1,17 +0,0 @@
set(mms_client_example5_SRCS
mms_client_example5.c
)
IF(WIN32)
set_source_files_properties(${mms_client_example5_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(mms_client_example5
${mms_client_example5_SRCS}
)
target_link_libraries(mms_client_example5
iec61850
)

View file

@ -1,17 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example5
PROJECT_SOURCES = mms_client_example5.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,50 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#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);
}

View file

@ -4,6 +4,7 @@
#include <unistd.h> #include <unistd.h>
#include "string_utilities.h" #include "string_utilities.h"
#include "mms_client_connection.h" #include "mms_client_connection.h"
#include "conversions.h"
static void static void
print_help() print_help()
@ -20,7 +21,9 @@ print_help()
printf("-a <domain_name> specify domain for read or write command\n"); printf("-a <domain_name> specify domain for read or write command\n");
printf("-f show file list\n"); printf("-f show file list\n");
printf("-g <filename> get file attributes\n"); printf("-g <filename> get file attributes\n");
printf("-x <filename> delete file\n");
printf("-j <domainName/journalName> read journal\n"); printf("-j <domainName/journalName> read journal\n");
printf("-v <variable list_name> read domain variable list\n");
printf("-m print raw MMS messages\n"); printf("-m print raw MMS messages\n");
} }
@ -96,7 +99,7 @@ printRawMmsMessage(void* parameter, uint8_t* message, int messageLength, bool re
int main(int argc, char** argv) { int main(int argc, char** argv) {
char* hostname = copyString("localhost"); char* hostname = StringUtils_copyString("localhost");
int tcpPort = 102; int tcpPort = 102;
int maxPduSize = 65000; int maxPduSize = 65000;
@ -114,17 +117,19 @@ int main(int argc, char** argv) {
int getFileAttributes = 0; int getFileAttributes = 0;
int readJournal = 0; int readJournal = 0;
int printRawMmsMessages = 0; int printRawMmsMessages = 0;
int deleteFile = 0;
int readVariableList = 0;
int c; int c;
while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:")) != -1) while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:x:v:")) != -1)
switch (c) { switch (c) {
case 'm': case 'm':
printRawMmsMessages = 1; printRawMmsMessages = 1;
break; break;
case 'h': case 'h':
hostname = copyString(optarg); hostname = StringUtils_copyString(optarg);
break; break;
case 'p': case 'p':
tcpPort = atoi(optarg); tcpPort = atoi(optarg);
@ -140,27 +145,35 @@ int main(int argc, char** argv) {
break; break;
case 't': case 't':
getDeviceDirectory = 1; getDeviceDirectory = 1;
domainName = copyString(optarg); domainName = StringUtils_copyString(optarg);
break; break;
case 'a': case 'a':
readWriteHasDomain = 1; readWriteHasDomain = 1;
domainName = copyString(optarg); domainName = StringUtils_copyString(optarg);
break; break;
case 'r': case 'r':
readVariable = 1; readVariable = 1;
variableName = copyString(optarg); variableName = StringUtils_copyString(optarg);
break; break;
case 'v':
readVariableList = 1;
variableName = StringUtils_copyString(optarg);
break;
case 'f': case 'f':
showFileList = 1; showFileList = 1;
break; break;
case 'g': case 'g':
getFileAttributes = 1; getFileAttributes = 1;
filename = copyString(optarg); filename = StringUtils_copyString(optarg);
break;
case 'x':
deleteFile = 1;
filename = StringUtils_copyString(optarg);
break; break;
case 'j': case 'j':
readJournal = 1; readJournal = 1;
journalName = copyString(optarg); journalName = StringUtils_copyString(optarg);
break; break;
default: default:
@ -335,6 +348,21 @@ int main(int argc, char** argv) {
printf("Reading VMD scope variable not yet supported!\n"); printf("Reading VMD scope variable not yet supported!\n");
} }
if (readVariableList) {
if (readWriteHasDomain) {
MmsValue* variables = MmsConnection_readNamedVariableListValues(con, &error, domainName, variableName, true);
if (error != MMS_ERROR_NONE) {
printf("Reading variable failed: (ERROR %i)\n", error);
}
else {
printf("Read SUCCESS\n");
}
}
else
printf("Reading VMD scope variable list not yet supported!\n");
}
if (showFileList) { if (showFileList) {
char lastName[300]; char lastName[300];
lastName[0] = 0; lastName[0] = 0;
@ -350,7 +378,19 @@ int main(int argc, char** argv) {
MmsConnection_getFileDirectory(con, &error, filename, NULL, mmsGetFileAttributeHandler, NULL); MmsConnection_getFileDirectory(con, &error, filename, NULL, mmsGetFileAttributeHandler, NULL);
} }
if (deleteFile) {
MmsConnection_fileDelete(con, &error, filename);
if (error != MMS_ERROR_NONE) {
printf("Delete file failed: (ERROR %i)\n", error);
}
else {
printf("File deleted\n");
}
}
exit: exit:
free(hostname);
MmsConnection_destroy(con); MmsConnection_destroy(con);
} }

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example1_SRCS
server_example1.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example1_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example1
${server_example1_SRCS}
)
target_link_libraries(server_example1
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example2_SRCS
server_example2.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example2_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example2
${server_example2_SRCS}
)
target_link_libraries(server_example2
iec61850
)

View file

@ -1,24 +0,0 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example2
PROJECT_SOURCES = server_example2.c
PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = complexModel.icd
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
model: $(PROJECT_ICD_FILE)
java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE)
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDFLAGS) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -1,91 +0,0 @@
/*
* server_example2.c
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
/* 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() */

File diff suppressed because it is too large Load diff

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example3_SRCS
server_example3.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example3_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example3
${server_example3_SRCS}
)
target_link_libraries(server_example3
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example4_SRCS
server_example4.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example4_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example4
${server_example4_SRCS}
)
target_link_libraries(server_example4
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example5_SRCS
server_example5.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example5_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example5
${server_example5_SRCS}
)
target_link_libraries(server_example5
iec61850
)

View file

@ -1,347 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" />
<IED name="ied1">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication password="true" />
<LDevice inst="Inverter">
<LN0 lnClass="LLN0" lnType="LLN02" inst="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="Inverter" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Battery" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="MX" lnInst="1" doName="TotW" daName="mag" />
</DataSet>
<ReportControl name="rcb1" confRev="0" datSet="dataset1" rptID="ID" intgPd="0" bufTime="0">
<TrgOps dchg="true" qchg="true" />
<OptFields />
</ReportControl>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD2" inst="1" prefix="" />
<LN lnClass="ZINV" lnType="ZINV3" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Battery">
<LN0 lnClass="LLN0" lnType="LLN03" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD3" inst="1" prefix="" />
<LN lnClass="ZBAT" lnType="ZBAT1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="ZBTC" lnType="ZBTC1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Physical_Measurements">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_Vol" />
<DO name="TotVAr" type="MV_1_Vol" />
<DO name="TotVA" type="MV_1_Vol" />
<DO name="Hz" type="MV_1_Vol" />
<DO name="PhV" type="WYE_1_PhV" />
<DO name="A" type="WYE_1_PhV" />
<DO name="W" type="WYE_1_W" />
</LNodeType>
<LNodeType id="ZBTC1" lnClass="ZBTC" desc="Battery charger">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="BatChaSt" type="ENG_1_BatChaSt" />
<DO name="BatChaPwr" type="ASG_1_BatChaPwr" />
<DO name="BatChaMod" type="ENG_1_BatChaSt" />
<DO name="ChaV" type="MV_1_Vol" />
<DO name="ChaA" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="ZBAT1" lnClass="ZBAT" desc="Battery">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="Vol" type="MV_1_Vol" />
<DO name="Amp" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN01" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LLN02" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD2" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN03" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD3" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="ZINV3" lnClass="ZINV" desc="Inverter">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="WRtg" type="ASG_1_WRtg" />
<DO name="VarRtg" type="ASG_1_WRtg" />
<DO name="ACTyp" type="ENG_1_ACTyp" />
<DO name="OutWSet" type="ASG_1_WRtg" />
<DO name="OutVarSet" type="ASG_1_WRtg" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="WYE_1_W" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
</DOType>
<DOType id="CMV_1_phsA" cdc="CMV">
<DA name="cVal" type="Vector_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_BatChaPwr" cdc="ASG" />
<DOType id="ENG_1_BatChaSt" cdc="ENG" />
<DOType id="WYE_1_PhV" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
<SDO name="neut" type="CMV_1_phsA" />
</DOType>
<DOType id="MV_1_Vol" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_WRtg" cdc="ASG">
<DA name="setMag" type="AnalogueValue_1" bType="Struct" fc="SP" />
<DA name="units" type="Unit_1" bType="Struct" fc="CF" />
</DOType>
<DOType id="ENG_1_ACTyp" cdc="ENG">
<DA name="setVal" bType="INT32" fc="SP" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Vector_1">
<BDA name="mag" type="AnalogueValue_1" bType="Struct" />
</DAType>
<DAType id="Unit_1">
<BDA name="SIUnit" type="SIUnit" bType="Enum" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="SIUnit">
<EnumVal ord="1">
</EnumVal>
<EnumVal ord="10">rad</EnumVal>
<EnumVal ord="11">sr</EnumVal>
<EnumVal ord="2">m</EnumVal>
<EnumVal ord="21">Gy</EnumVal>
<EnumVal ord="22">q</EnumVal>
<EnumVal ord="23">ðC</EnumVal>
<EnumVal ord="24">Sv</EnumVal>
<EnumVal ord="25">F</EnumVal>
<EnumVal ord="26">C</EnumVal>
<EnumVal ord="27">S</EnumVal>
<EnumVal ord="28">H</EnumVal>
<EnumVal ord="29">V</EnumVal>
<EnumVal ord="3">kg</EnumVal>
<EnumVal ord="30">ohm</EnumVal>
<EnumVal ord="31">J</EnumVal>
<EnumVal ord="32">N</EnumVal>
<EnumVal ord="33">Hz</EnumVal>
<EnumVal ord="34">Ix</EnumVal>
<EnumVal ord="35">Lm</EnumVal>
<EnumVal ord="36">Wb</EnumVal>
<EnumVal ord="37">T</EnumVal>
<EnumVal ord="38">W</EnumVal>
<EnumVal ord="39">Pa</EnumVal>
<EnumVal ord="4">s</EnumVal>
<EnumVal ord="41">mò</EnumVal>
<EnumVal ord="42">mó</EnumVal>
<EnumVal ord="43">m/s</EnumVal>
<EnumVal ord="44">m/sò</EnumVal>
<EnumVal ord="45">mó/s</EnumVal>
<EnumVal ord="46">m/mó</EnumVal>
<EnumVal ord="47">M</EnumVal>
<EnumVal ord="48">kg/mó</EnumVal>
<EnumVal ord="49">mò/s</EnumVal>
<EnumVal ord="5">A</EnumVal>
<EnumVal ord="50">W/m K</EnumVal>
<EnumVal ord="51">J/K</EnumVal>
<EnumVal ord="52">ppm</EnumVal>
<EnumVal ord="53">1/s</EnumVal>
<EnumVal ord="54">rad/s</EnumVal>
<EnumVal ord="6">K</EnumVal>
<EnumVal ord="61">VA</EnumVal>
<EnumVal ord="62">Watts</EnumVal>
<EnumVal ord="63">VAr</EnumVal>
<EnumVal ord="64">theta</EnumVal>
<EnumVal ord="65">cos(theta)</EnumVal>
<EnumVal ord="66">Vs</EnumVal>
<EnumVal ord="67">Vò</EnumVal>
<EnumVal ord="68">As</EnumVal>
<EnumVal ord="69">Aò</EnumVal>
<EnumVal ord="7">mol</EnumVal>
<EnumVal ord="70">Aòt</EnumVal>
<EnumVal ord="71">VAh</EnumVal>
<EnumVal ord="72">Wh</EnumVal>
<EnumVal ord="73">VArh</EnumVal>
<EnumVal ord="74">V/Hz</EnumVal>
<EnumVal ord="8">cd</EnumVal>
<EnumVal ord="9">deg</EnumVal>
</EnumType>
<EnumType id="Multiplier">
<EnumVal ord="-24">Yocto</EnumVal>
<EnumVal ord="-21">Zepto</EnumVal>
<EnumVal ord="-18">Atto</EnumVal>
<EnumVal ord="-15">Femto</EnumVal>
<EnumVal ord="-12">Pico</EnumVal>
<EnumVal ord="-9">Nano</EnumVal>
<EnumVal ord="-6">Micro</EnumVal>
<EnumVal ord="-3">Milli</EnumVal>
<EnumVal ord="-2">Centi</EnumVal>
<EnumVal ord="-1">Deci</EnumVal>
<EnumVal ord="0">zeroNoValue</EnumVal>
<EnumVal ord="1">Deca</EnumVal>
<EnumVal ord="2">Hecto</EnumVal>
<EnumVal ord="3">Kilo</EnumVal>
<EnumVal ord="6">Mega</EnumVal>
<EnumVal ord="9">Giga</EnumVal>
<EnumVal ord="12">Tera</EnumVal>
<EnumVal ord="15">Petra</EnumVal>
<EnumVal ord="18">Exa</EnumVal>
<EnumVal ord="21">Zetta</EnumVal>
<EnumVal ord="24">Yotta</EnumVal>
</EnumType>
<EnumType id="Range">
<EnumVal ord="0">normal</EnumVal>
<EnumVal ord="1">high</EnumVal>
<EnumVal ord="2">low</EnumVal>
<EnumVal ord="3">high-high</EnumVal>
<EnumVal ord="4">low-low</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

View file

@ -1,609 +0,0 @@
/*
* static_model.h
*
* automatically generated from complexModel.icd
*/
#ifndef STATIC_MODEL_H_
#define STATIC_MODEL_H_
#include <stdlib.h>
#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_ */

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SRCS
server_example_basic_io.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_basic_io
${server_example_SRCS}
)
target_link_libraries(server_example_basic_io
iec61850
)

View file

@ -0,0 +1,31 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_basic_io
PROJECT_SOURCES = server_example_basic_io.c
PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = simpleIO_direct_control.icd
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
LDLIBS += -lm
CP = cp
model: $(PROJECT_ICD_FILE)
java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE)
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
$(CP) $(PROJECT_BINARY_NAME) vmd-filestore/IEDSERVER.BIN
clean:
rm -f $(PROJECT_BINARY_NAME)
rm -f vmd-filestore/IEDSERVER.BIN

View file

@ -1,5 +1,5 @@
/* /*
* server_example3.c * server_example_basic_io.c
* *
* - How to use simple control models * - How to use simple control models
* - How to serve analog measurement data * - How to serve analog measurement data
@ -12,7 +12,7 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include "static_model.h" #include "../server_example_basic_io/static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;
@ -85,6 +85,10 @@ main(int argc, char** argv)
iedServer = IedServer_create(&iedModel); iedServer = IedServer_create(&iedModel);
/* Set the base path for the MMS file services */
MmsServer mmsServer = IedServer_getMmsServer(iedServer);
MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/");
/* Install handler for operate command */ /* Install handler for operate command */
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
(ControlHandler) controlHandlerForBinaryOutput, (ControlHandler) controlHandlerForBinaryOutput,

View file

@ -87,9 +87,9 @@
<TrgOps dchg="true" qchg="true"/> <TrgOps dchg="true" qchg="true"/>
</LogControl> </LogControl>
<LogControl name="GeneralLog" datSet="" logName=""> <LogControl name="GeneralLog" logName="">
<TrgOps dchg="true" qchg="true"/> <TrgOps dchg="true" qchg="true"/>
</LogControl> </LogControl>
<Log /> <Log />

File diff suppressed because it is too large Load diff

View file

@ -13,7 +13,7 @@ all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk include $(LIBIEC_HOME)/make/common_targets.mk
model: $(PROJECT_ICD_FILE) model: $(PROJECT_ICD_FILE)
java -jar $(LIBIEC_HOME)/tools/model_generator/genconfig.jar $(PROJECT_ICD_FILE) > vmd-filestore/model.cfg java -jar $(LIBIEC_HOME)/tools/model_generator/genconfig.jar $(PROJECT_ICD_FILE) model.cfg
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) $(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)

View file

@ -2,7 +2,6 @@ MODEL(simpleIO){
LD(GenericIO){ LD(GenericIO){
LN(LLN0){ LN(LLN0){
DO(Mod 0){ DO(Mod 0){
DA(stVal 0 3 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=0; DA(ctlModel 0 12 4 0 0)=0;
@ -18,9 +17,9 @@ DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
} }
DO(NamPlt 0){ DO(NamPlt 0){
DA(vendor 0 20 5 0 0)="MZ Automation"; DA(vendor 0 20 5 0 0);
DA(swRev 0 20 5 0 0)="0.7.3"; DA(swRev 0 20 5 0 0);
DA(d 0 20 5 0 0)="libiec61850 server example"; DA(d 0 20 5 0 0);
DA(configRev 0 20 5 0 0); DA(configRev 0 20 5 0 0);
DA(ldNs 0 20 11 0 0); DA(ldNs 0 20 11 0 0);
} }
@ -30,33 +29,24 @@ DE(GGIO1$ST$SPCSO2$stVal);
DE(GGIO1$ST$SPCSO3$stVal); DE(GGIO1$ST$SPCSO3$stVal);
DE(GGIO1$ST$SPCSO4$stVal); DE(GGIO1$ST$SPCSO4$stVal);
} }
DS(Events2){ DS(AnalogValues){
DE(GGIO1$ST$SPCSO1); DE(GGIO1$MX$AnIn1);
DE(GGIO1$ST$SPCSO2); DE(GGIO1$MX$AnIn2);
DE(GGIO1$ST$SPCSO3); DE(GGIO1$MX$AnIn3);
DE(GGIO1$ST$SPCSO4); DE(GGIO1$MX$AnIn4);
} }
DS(Measurements){ RC(EventsRCB01 Events 0 Events 1 24 111 50 1000);
DE(GGIO1$MX$AnIn1$mag$f); RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 24 111 50 1000);
DE(GGIO1$MX$AnIn1$q); LC(EventLog Events GenericIO/LLN0$EventLog 19 0 0 1);
DE(GGIO1$MX$AnIn2$mag$f); LC(GeneralLog - - 19 0 0 1);
DE(GGIO1$MX$AnIn2$q);
DE(GGIO1$MX$AnIn3$mag$f);
DE(GGIO1$MX$AnIn3$q);
DE(GGIO1$MX$AnIn4$mag$f);
DE(GGIO1$MX$AnIn4$q);
}
RC(EventsRCB01 Events1 0 Events 4294967295 24 111 50 1000);
RC(EventsIndexed01 Events2 0 Events 1 24 111 50 1000);
RC(EventsIndexed02 Events2 0 Events 1 24 111 50 1000);
RC(EventsIndexed03 Events2 0 Events 1 24 111 50 1000);
RC(Measurements01 Measurements 1 Measurements 1 16 111 50 1000);
RC(Measurements02 Measurements 1 Measurements 1 16 111 50 1000);
RC(Measurements03 Measurements 1 Measurements 1 16 111 50 1000);
LC(EventLog Events GenericIO/LLN0$EventLog 19 0 1 1);
LC(GeneralLog - - 19 0 1 1);
LOG(GeneralLog); LOG(GeneralLog);
LOG(EventLog); LOG(EventLog);
GC(gcbEvents events Events 2 0 -1 -1 ){
PA(4 273 4096 010ccd010001);
}
GC(gcbAnalogValues analog AnalogValues 2 0 -1 -1 ){
PA(4 273 4096 010ccd010001);
}
} }
LN(LPHD1){ LN(LPHD1){
DO(PhyNam 0){ DO(PhyNam 0){
@ -102,11 +92,11 @@ DA(q 0 23 1 2 0);
DA(t 0 22 1 0 0); DA(t 0 22 1 0 0);
} }
DO(AnIn2 0){ DO(AnIn2 0){
DA(mag 0 27 1 1 0){ DA(mag 0 27 1 1 101){
DA(f 0 10 1 1 0); DA(f 0 10 1 1 0);
} }
DA(q 0 23 1 2 0); DA(q 0 23 1 2 0);
DA(t 0 22 1 0 0); DA(t 0 22 1 0 102);
} }
DO(AnIn3 0){ DO(AnIn3 0){
DA(mag 0 27 1 1 0){ DA(mag 0 27 1 1 0){

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SRCS
server_example_files.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_files
${server_example_SRCS}
)
target_link_libraries(server_example_files
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example3 PROJECT_BINARY_NAME = server_example_files
PROJECT_SOURCES = server_example3.c PROJECT_SOURCES = server_example_files.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = simpleIO_direct_control.icd PROJECT_ICD_FILE = simpleIO_direct_control.icd

View file

@ -0,0 +1,98 @@
/*
* server_example_files.c
*
* - How to use some special MMS file service features
* - How to control how files file services can be used
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "static_model.h"
/* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel;
static int running = 0;
static IedServer iedServer = NULL;
void
sigint_handler(int signalId)
{
running = 0;
}
static void
connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
{
if (connected)
printf("Connection opened\n");
else
printf("Connection closed\n");
}
static MmsError
fileAccessHandler (void* parameter, MmsServerConnection connection, MmsFileServiceType service,
const char* localFilename, const char* otherFilename)
{
printf("fileAccessHandler: service = %i, local-file: %s other-file: %s\n", service, localFilename, otherFilename);
/* Don't allow client to rename files */
if (service == MMS_FILE_ACCESS_TYPE_RENAME)
return MMS_ERROR_FILE_FILE_ACCESS_DENIED;
/* Don't allow client to delete fike "IEDSERVER.BIN" */
if (service == MMS_FILE_ACCESS_TYPE_DELETE) {
if (strcmp(localFilename, "IEDSERVER.BIN") == 0)
return MMS_ERROR_FILE_FILE_ACCESS_DENIED;
}
/* allow all other accesses */
return MMS_ERROR_NONE;
}
int
main(int argc, char** argv)
{
printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());
iedServer = IedServer_create(&iedModel);
/* Set the base path for the MMS file services */
MmsServer mmsServer = IedServer_getMmsServer(iedServer);
MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/");
/* Set a callback handler to control file accesses */
MmsServer_installFileAccessHandler(mmsServer, fileAccessHandler, NULL);
IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);
/* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, 102);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
while (running)
Thread_sleep(100);
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
} /* main() */

View file

@ -0,0 +1,281 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName">
</Header>
<Communication>
<SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address>
<P type="IP">10.0.0.2</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="simpleIO">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling />
<GSEDir />
<TimerActivatedControl />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication />
<LDevice inst="GenericIO">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DataSet name="Events" desc="Events">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" daName="stVal" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" daName="stVal" />
</DataSet>
<DataSet name="Events2" desc="Events2">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO1" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO2" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO3" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="ST" lnInst="1" doName="SPCSO4" />
</DataSet>
<DataSet name="Measurements" desc="Measurements">
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn1" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn2" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn3" daName="q" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="mag.f" />
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet>
<ReportControl name="EventsRCB" confRev="4294967295" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" entryID="true" configRef="true" />
<RptEnabled max="3" />
</ReportControl>
<LogControl name="EventLog" datSet="Events" logName="EventLog">
<TrgOps dchg="true" qchg="true"/>
</LogControl>
<LogControl name="GeneralLog" logName="">
<TrgOps dchg="true" qchg="true"/>
</LogControl>
<Log />
<Log name="EventLog" />
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MZ Automation</Val>
</DAI>
<DAI name="swRev">
<Val>0.7.3</Val>
</DAI>
<DAI name="d">
<Val>libiec61850 server example</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="SPCSO1">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO2">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO3">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
<DOI name="SPCSO4">
<DAI name="ctlModel">
<Val>direct-with-normal-security</Val>
</DAI>
</DOI>
</LN>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="INC_2_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="AnIn1" type="MV_1_AnIn1" />
<DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_2_SPCSO1" />
<DO name="SPCSO2" type="SPC_1_SPCSO2" />
<DO name="SPCSO3" type="SPC_1_SPCSO3" />
<DO name="SPCSO4" type="SPC_1_SPCSO1" />
<DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" />
<DO name="Ind4" type="SPS_1_Proxy" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="MV_1_AnIn1" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="INC_2_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="SPC_2_SPCSO1" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO2" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="SPC_1_SPCSO3" cdc="SPC">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Originator_1">
<BDA name="orCat" type="OrCat" bType="Enum" />
<BDA name="orIdent" bType="Octet64" />
</DAType>
<DAType id="SPCOperate_1">
<BDA name="ctlVal" bType="BOOLEAN" />
<BDA name="origin" type="Originator_1" bType="Struct" />
<BDA name="ctlNum" bType="INT8U" />
<BDA name="T" bType="Timestamp" />
<BDA name="Test" bType="BOOLEAN" />
<BDA name="Check" bType="Check" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="OrCat">
<EnumVal ord="0">not-supported</EnumVal>
<EnumVal ord="1">bay-control</EnumVal>
<EnumVal ord="2">station-control</EnumVal>
<EnumVal ord="3">remote-control</EnumVal>
<EnumVal ord="4">automatic-bay</EnumVal>
<EnumVal ord="5">automatic-station</EnumVal>
<EnumVal ord="6">automatic-remote</EnumVal>
<EnumVal ord="7">maintenance</EnumVal>
<EnumVal ord="8">process</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

View file

@ -1944,13 +1944,13 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report4;
extern ReportControlBlock iedModel_GenericIO_LLN0_report5; extern ReportControlBlock iedModel_GenericIO_LLN0_report5;
extern ReportControlBlock iedModel_GenericIO_LLN0_report6; extern ReportControlBlock iedModel_GenericIO_LLN0_report6;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report2};
ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report3};
ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report4}; ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report4};
ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, &iedModel_GenericIO_LLN0_report5}; ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5};
ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, &iedModel_GenericIO_LLN0_report6}; ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6};
ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 111, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL};

View file

@ -0,0 +1,301 @@
/*
* static_model.h
*
* automatically generated from simpleIO_direct_control.icd
*/
#ifndef STATIC_MODEL_H_
#define STATIC_MODEL_H_
#include <stdlib.h>
#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_ */

View file

@ -0,0 +1 @@
test

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SRCS
server_example_password_auth.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_password_auth
${server_example_SRCS}
)
target_link_libraries(server_example_password_auth
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example4 PROJECT_BINARY_NAME = server_example_password_auth
PROJECT_SOURCES = server_example4.c PROJECT_SOURCES = server_example_password_auth.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = simpleIO_direct_control.icd PROJECT_ICD_FILE = simpleIO_direct_control.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example4.c * server_example_password_auth.c
* *
* Example server application with password authentication. * Example server application with password authentication.
* *
@ -15,11 +15,11 @@
*/ */
#include "iec61850_server.h" #include "iec61850_server.h"
#include "static_model.h"
#include "hal_thread.h" #include "hal_thread.h"
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "../server_example_password_auth/static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;
@ -37,13 +37,32 @@ void sigint_handler(int signalId)
static char* password1 = "user1@testpw"; static char* password1 = "user1@testpw";
static char* password2 = "user2@testpw"; static char* password2 = "user2@testpw";
static void printAppTitle(ItuObjectIdentifier* oid)
{
int i;
for (i = 0; i < oid->arcCount; i++) {
printf("%i", oid->arc[i]);
if (i != (oid->arcCount - 1))
printf(".");
}
}
/** /**
* This is the AcseAuthenticator callback function that is invoked on each client connection attempt. * 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. * When returning true the server stack accepts the client. Otherwise the connection is rejected.
*
* The security token can be used to pass an application specific object to other library callbacks
*/ */
static bool static bool
clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken) clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appRef)
{ {
printf("ACSE Authenticator:\n");
printf(" client ap-title: "); printAppTitle(&(appRef->apTitle)); printf("\n");
printf(" client ae-qualifier: %i\n", appRef->aeQualifier);
if (authParameter->mechanism == ACSE_AUTH_PASSWORD) { if (authParameter->mechanism == ACSE_AUTH_PASSWORD) {
if (authParameter->value.password.passwordLength == strlen(password1)) { if (authParameter->value.password.passwordLength == strlen(password1)) {
if (memcmp(authParameter->value.password.octetString, password1, if (memcmp(authParameter->value.password.octetString, password1,

View file

@ -3,7 +3,7 @@
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.icd
*/ */
#include "static_model.h" #include "../server_example_password_auth/static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SRCS
server_example_simple.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_simple
${server_example_SRCS}
)
target_link_libraries(server_example_simple
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example1 PROJECT_BINARY_NAME = server_example_simple
PROJECT_SOURCES = server_example1.c PROJECT_SOURCES = server_example_simple.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = sampleModel_with_dataset.icd PROJECT_ICD_FILE = sampleModel_with_dataset.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example1.c * server_example_simple.c
* *
* Copyright 2013 Michael Zillgith * Copyright 2013 Michael Zillgith
* *
@ -27,7 +27,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "static_model.h" #include "../server_example_simple/static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;

View file

@ -3,7 +3,7 @@
* *
* automatically generated from sampleModel_with_dataset.icd * automatically generated from sampleModel_with_dataset.icd
*/ */
#include "static_model.h" #include "../server_example_simple/static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example_SRCS
server_example_write_handler.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_write_handler
${server_example_SRCS}
)
target_link_libraries(server_example_write_handler
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example5 PROJECT_BINARY_NAME = server_example_write_handler
PROJECT_SOURCES = server_example5.c PROJECT_SOURCES = server_example_write_handler.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = complexModel.icd PROJECT_ICD_FILE = complexModel.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example5.c * server_example_write_handler.c
*/ */
#include "iec61850_server.h" #include "iec61850_server.h"
@ -8,7 +8,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "static_model.h" #include "../server_example_write_handler/static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;

View file

@ -3,7 +3,7 @@
* *
* automatically generated from complexModel.icd * automatically generated from complexModel.icd
*/ */
#include "static_model.h" #include "../server_example_write_handler/static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -20,7 +20,16 @@ void sigint_handler(int signalId)
int int
main(int argc, char** argv) main(int argc, char** argv)
{ {
SampledValuesPublisher svPublisher = SampledValuesPublisher_create("vboxnet0"); char* interface;
if (argc > 1)
interface = argv[1];
else
interface = "eth0";
printf("Using interface %s\n", interface);
SampledValuesPublisher svPublisher = SampledValuesPublisher_create(NULL, interface);
SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1);
@ -51,7 +60,7 @@ main(int argc, char** argv)
SampledValuesPublisher_publish(svPublisher); SampledValuesPublisher_publish(svPublisher);
//Thread_sleep(50); Thread_sleep(50);
} }
SampledValuesPublisher_destroy(svPublisher); SampledValuesPublisher_destroy(svPublisher);

View file

@ -6,6 +6,7 @@ ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabihf-
#ARM_TOOLCHAIN_PREFIX=arm-poky-linux-gnueabi- #ARM_TOOLCHAIN_PREFIX=arm-poky-linux-gnueabi-
#ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi- #ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi-
UCLINUX_ARM_TOOLCHAIN_PREFIX=arm-uclinux-elf- UCLINUX_ARM_TOOLCHAIN_PREFIX=arm-uclinux-elf-
UCLINUX_XPORT_TOOLCHAIN_PREFIX=m68k-uclinux-
MINGW_TOOLCHAIN_PREFIX=i586-mingw32msvc- MINGW_TOOLCHAIN_PREFIX=i586-mingw32msvc-
#MINGW_TOOLCHAIN_PREFIX=x86_64-w64-mingw32- #MINGW_TOOLCHAIN_PREFIX=x86_64-w64-mingw32-
MINGW64_TOOLCHAIN_PREFIX=x86_64-w64-mingw32- MINGW64_TOOLCHAIN_PREFIX=x86_64-w64-mingw32-
@ -60,6 +61,14 @@ CFLAGS += -mno-unaligned-access
#CFLAGS += -mcpu=arm926ej-s #CFLAGS += -mcpu=arm926ej-s
endif endif
ifeq ($(TARGET), UCLINUX-XPORT)
TOOLCHAIN_PREFIX=$(UCLINUX_XPORT_TOOLCHAIN_PREFIX)
CFLAGS += -DPLATFORM_BYTE_ORDER
CFLAGS += -mcpu=5208
CFLAGS += -fno-builtin -fno-common
CFLAGS += -fno-dwarf2-cfi-asm -msep-data -DCONFIG_COLDFIRE -D__linux__ -Dunix -D__uClinux__
endif
ifeq ($(TARGET), UCLINUX-WAGO) ifeq ($(TARGET), UCLINUX-WAGO)
TOOLCHAIN_PREFIX=$(UCLINUX_ARM_TOOLCHAIN_PREFIX) TOOLCHAIN_PREFIX=$(UCLINUX_ARM_TOOLCHAIN_PREFIX)
CFLAGS += -msoft-float CFLAGS += -msoft-float

View file

@ -1,7 +1,7 @@
FIND_PACKAGE(SWIG REQUIRED) FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE}) INCLUDE(${SWIG_USE_FILE})
FIND_PACKAGE(PythonLibs REQUIRED) FIND_PACKAGE(PythonLibs REQUIRED)
FIND_PACKAGE ( PythonInterp REQUIRED ) FIND_PACKAGE ( PythonInterp ${PYTHONLIBS_VERSION_STRING} EXACT REQUIRED )
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS "") SET(CMAKE_SWIG_FLAGS "")
@ -17,7 +17,7 @@ EXECUTE_PROCESS ( #Finding python modules install path
"import site, sys; sys.stdout.write(site.getsitepackages()[-1])" "import site, sys; sys.stdout.write(site.getsitepackages()[-1])"
OUTPUT_VARIABLE PYTHON_SITE_DIR OUTPUT_VARIABLE PYTHON_SITE_DIR
) )
INSTALL ( FILES ${CMAKE_BINARY_DIR}/iec61850.py DESTINATION ${PYTHON_SITE_DIR}) INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/iec61850.py DESTINATION ${PYTHON_SITE_DIR})
INSTALL ( TARGETS _iec61850 LIBRARY DESTINATION ${PYTHON_SITE_DIR}) INSTALL ( TARGETS _iec61850 LIBRARY DESTINATION ${PYTHON_SITE_DIR})
add_test(test_pyiec61850 ${PYTHON_EXECUTABLE} test_pyiec61850.py) add_test(test_pyiec61850 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/test_pyiec61850.py)

View file

@ -0,0 +1,37 @@
#!/usr/bin/python
import os,sys
import iec61850
if __name__=="__main__":
hostname = "localhost";
tcpPort = 102
if len(sys.argv)>1:
hostname = sys.argv[1]
if len(sys.argv)>2:
port = sys.argv[2]
con = iec61850.IedConnection_create()
error = iec61850.IedConnection_connect(con, hostname, tcpPort)
if (error == iec61850.IED_ERROR_OK):
[deviceList, error] = iec61850.IedConnection_getLogicalDeviceList(con)
device = iec61850.LinkedList_getNext(deviceList)
while device:
LD_name=iec61850.toCharP(device.data)
print("LD: %s" % LD_name)
[logicalNodes, error] = iec61850.IedConnection_getLogicalDeviceDirectory(con, LD_name)
logicalNode = iec61850.LinkedList_getNext(logicalNodes)
while logicalNode:
LN_name=iec61850.toCharP(logicalNode.data)
print(" LN: %s" % LN_name)
[LNobjects, error] = iec61850.IedConnection_getLogicalNodeVariables(con, LD_name+"/"+LN_name)
LNobject = iec61850.LinkedList_getNext(LNobjects)
while LNobject:
print(" DO: %s" % iec61850.toCharP(LNobject.data))
LNobject = iec61850.LinkedList_getNext(LNobject)
iec61850.LinkedList_destroy(LNobjects)
logicalNode = iec61850.LinkedList_getNext(logicalNode)
iec61850.LinkedList_destroy(logicalNodes)
device = iec61850.LinkedList_getNext(device)
iec61850.LinkedList_destroy(deviceList)
iec61850.IedConnection_close(con)
else:
print("Failed to connect to %s:%i\n"%(hostname, tcpPort))
iec61850.IedConnection_destroy(con)

View file

@ -18,6 +18,10 @@ ModelNode* toModelNode(DataObject * DO)
{ {
return (ModelNode*) DO; return (ModelNode*) DO;
} }
char* toCharP(void * v)
{
return (char *) v;
}
DataAttribute* toDataAttribute(DataObject * DO) DataAttribute* toDataAttribute(DataObject * DO)
{ return (DataAttribute*)DO;} { return (DataAttribute*)DO;}
DataAttribute* toDataAttribute(ModelNode * MN) DataAttribute* toDataAttribute(ModelNode * MN)
@ -35,8 +39,9 @@ DataAttribute* toDataAttribute(ModelNode * MN)
%include "iec61850_server.h" %include "iec61850_server.h"
%include "iec61850_dynamic_model.h" %include "iec61850_dynamic_model.h"
%include "iec61850_cdc.h" %include "iec61850_cdc.h"
%include "linked_list.h %include "linked_list.h"
ModelNode* toModelNode(LogicalNode *); ModelNode* toModelNode(LogicalNode *);
ModelNode* toModelNode(DataObject *); ModelNode* toModelNode(DataObject *);
DataAttribute* toDataAttribute(DataObject *); DataAttribute* toDataAttribute(DataObject *);
DataAttribute* toDataAttribute(ModelNode *); DataAttribute* toDataAttribute(ModelNode *);
char* toCharP(void *);

View file

@ -1,11 +1,12 @@
#!/usr/bin/python #!/usr/bin/python
import sys import sys
import time import time
import iec61850
import threading import threading
import traceback import traceback
import signal import signal
import sys import sys
sys.path.append('.')
import iec61850
def signal_handler(signal, frame): def signal_handler(signal, frame):
global running global running
running =0 running =0
@ -54,20 +55,20 @@ def testClient():
theVal = "testmodelSENSORS/TTMP1.TmpSp.setMag.f" theVal = "testmodelSENSORS/TTMP1.TmpSp.setMag.f"
theValType = iec61850.IEC61850_FC_SP theValType = iec61850.IEC61850_FC_SP
temperatureSetpoint = iec61850.IedConnection_readFloatValue(con, theVal, theValType) temperatureSetpoint = iec61850.IedConnection_readFloatValue(con, theVal, theValType)
print temperatureSetpoint print(temperatureSetpoint)
assert(temperatureValue[1]==0) assert(temperatureValue[1]==0)
newValue= temperatureValue[0]+10 newValue= temperatureValue[0]+10
err = iec61850.IedConnection_writeFloatValue(con, theVal, theValType, newValue) err = iec61850.IedConnection_writeFloatValue(con, theVal, theValType, newValue)
assert(err==0) assert(err==0)
temperatureSetpoint = iec61850.IedConnection_readFloatValue(con, theVal, theValType) temperatureSetpoint = iec61850.IedConnection_readFloatValue(con, theVal, theValType)
print temperatureSetpoint print(temperatureSetpoint)
assert(temperatureSetpoint[0]==newValue) assert(temperatureSetpoint[0]==newValue)
iec61850.IedConnection_close(con) iec61850.IedConnection_close(con)
else: else:
print "Connection error" print("Connection error")
sys.exit(-1) sys.exit(-1)
iec61850.IedConnection_destroy(con) iec61850.IedConnection_destroy(con)
print "client ok" print("client ok")
try: try:
srv=myIECServer() srv=myIECServer()
srvThread = threading.Thread(target = srv.run) srvThread = threading.Thread(target = srv.run)
@ -77,6 +78,6 @@ try:
#signal.pause() #signal.pause()
except: except:
running = 0 running = 0
print "Error :" print("Error :")
traceback.print_exc(file=sys.stdout) traceback.print_exc(file=sys.stdout)
sys.exit(-1) sys.exit(-1)

Some files were not shown because too many files have changed in this diff Show more