- IEC 61850 server: implemented service tracking for BRCBs and URCBs

pull/259/head
Michael Zillgith 5 years ago
parent 920eabe31f
commit 2f5817e0ac

@ -40,6 +40,7 @@ option(CONFIG_INCLUDE_GOOSE_SUPPORT "Build with GOOSE support" ON)
option(CONFIG_IEC61850_CONTROL_SERVICE "Build with support for IEC 61850 control features" ON)
option(CONFIG_IEC61850_REPORT_SERVICE "Build with support for IEC 61850 reporting services" ON)
option(CONFIG_IEC61850_LOG_SERVICE "Build with support for IEC 61850 logging services" ON)
option(CONFIG_IEC61850_SERVICE_TRACKING "Build with support for IEC 61850 service tracking" ON)
option(CONFIG_IEC61850_SETTING_GROUPS "Build with support for IEC 61850 setting group services" ON)
option(CONFIG_IEC61850_SUPPORT_USER_READ_ACCESS_CONTROL "Allow user provided callback to control read access" ON)

@ -161,6 +161,9 @@
/* include support for IEC 61850 log services */
#define CONFIG_IEC61850_LOG_SERVICE 1
/* include support for IEC 61850 service tracking */
#define CONFIG_IEC61850_SERVICE_TRACKING 1
/* allow user to control read access by callback */
#define CONFIG_IEC61850_SUPPORT_USER_READ_ACCESS_CONTROL 1

@ -151,6 +151,9 @@
/* include support for IEC 61850 log services */
#cmakedefine01 CONFIG_IEC61850_LOG_SERVICE
/* include support for IEC 61850 service tracking */
#cmakedefine01 CONFIG_IEC61850_SERVICE_TRACKING
/* allow user to control read access by callback */
#cmakedefine01 CONFIG_IEC61850_SUPPORT_USER_READ_ACCESS_CONTROL

@ -12,6 +12,7 @@ add_subdirectory(server_example_setting_groups)
add_subdirectory(server_example_logging)
add_subdirectory(server_example_files)
add_subdirectory(server_example_substitution)
add_subdirectory(server_example_service_tracking)
add_subdirectory(iec61850_client_example1)
add_subdirectory(iec61850_client_example2)

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

@ -0,0 +1,200 @@
/*
* server_example_service_tracking.c
*
* - How enable and use service tracking
*/
#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 ControlHandlerResult
controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test)
{
if (test)
return CONTROL_RESULT_FAILED;
if (MmsValue_getType(value) == MMS_BOOLEAN) {
printf("received binary control command: ");
if (MmsValue_getBoolean(value))
printf("on\n");
else
printf("off\n");
}
else
return CONTROL_RESULT_FAILED;
uint64_t timeStamp = Hal_getTimeInMs();
if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) {
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);
IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value);
}
if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);
IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);
}
if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);
IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);
}
if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp);
IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);
}
return CONTROL_RESULT_OK;
}
static void
connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
{
if (connected)
printf("Connection opened\n");
else
printf("Connection closed\n");
}
int
main(int argc, char** argv)
{
printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());
/* Create new server configuration object */
IedServerConfig config = IedServerConfig_create();
/* Set buffer size for buffered report control blocks to 200000 bytes */
IedServerConfig_setReportBufferSize(config, 200000);
/* Set stack compliance to a specific edition of the standard (WARNING: data model has also to be checked for compliance) */
IedServerConfig_setEdition(config, IEC_61850_EDITION_2);
/* Set the base path for the MMS file services */
IedServerConfig_setFileServiceBasePath(config, "./vmd-filestore/");
/* disable MMS file service */
IedServerConfig_enableFileService(config, false);
/* TODO enable service tracking feature */
//IedServerConfig_enableServiceTracking(config, true);
/* enable dynamic data set service */
IedServerConfig_enableDynamicDataSetService(config, true);
/* disable log service */
IedServerConfig_enableLogService(config, false);
/* set maximum number of clients */
IedServerConfig_setMaxMmsConnections(config, 5);
/* Create a new IEC 61850 server instance */
iedServer = IedServer_createWithConfig(&iedModel, NULL, config);
/* configuration object is no longer required */
IedServerConfig_destroy(config);
/* set the identity values for MMS identify service */
IedServer_setServerIdentity(iedServer, "MZ", "service_tracking", "1.0.0");
/* Install handler for operate command */
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
(ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO1);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,
(ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO2);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,
(ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO3);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4,
(ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO4);
IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);
/* MMS server will be instructed to start listening for client connections. */
IedServer_start(iedServer, 102);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed (maybe need root permissions or another server is already using the port)! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
float t = 0.f;
while (running) {
uint64_t timestamp = Hal_getTimeInMs();
t += 0.1f;
float an1 = sinf(t);
float an2 = sinf(t + 1.f);
float an3 = sinf(t + 2.f);
float an4 = sinf(t + 3.f);
Timestamp iecTimestamp;
Timestamp_clearFlags(&iecTimestamp);
Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp);
Timestamp_setLeapSecondKnown(&iecTimestamp, true);
/* toggle clock-not-synchronized flag in timestamp */
if (((int) t % 2) == 0)
Timestamp_setClockNotSynchronized(&iecTimestamp, true);
IedServer_lockDataModel(iedServer);
IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp);
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);
IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp);
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);
IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp);
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);
IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp);
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);
IedServer_unlockDataModel(iedServer);
Thread_sleep(100);
}
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
} /* main() */

@ -0,0 +1,555 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.iec.ch/61850/2003/SCL" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL SCL.xsd" version="2007" revision="B">
<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">0.0.0.0</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">192.168.2.1</P>
<P type="OSI-AP-Title">1,3,9999,33</P>
<P type="OSI-AE-Qualifier">33</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="MMS-Port">102</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>
<DataSet name="ServiceTracking">
<FCDA doName="SpcTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="DpcTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="IncTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="BscTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="UrcbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="BrcbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
<FCDA doName="GocbTrk" fc="SR" ldInst="GenericIO" lnClass="LTRK" lnInst="1"/>
</DataSet>
<ReportControl name="EventsRCB" confRev="1" datSet="Events2" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true"/>
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="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" 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>
<ReportControl buffered="true" confRev="1" datSet="ServiceTracking" name="brcbServiceTracking" rptID="ServiceTracking">
<TrgOps dchg="true" qchg="true"/>
<OptFields configRef="true" entryID="true" reasonCode="true"/>
<RptEnabled max="3"/>
</ReportControl>
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
<DOI name="NamPlt">
<DAI name="vendor">
<Val>MZ Automation</Val>
</DAI>
<DAI name="swRev">
<Val>1.3.0</Val>
</DAI>
<DAI name="d">
<Val>libiec61850 server example</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="">
<DOI name="PhyHealth">
<DAI name="stVal">
<Val>ok</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="GGIO" lnType="GGIO1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
<DOI name="Beh">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="Health">
<DAI name="stVal">
<Val>ok</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>
<LN desc="Service Tracking Information" inst="1" lnClass="LTRK" lnType="myLTRK"/>
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="LLN01" lnClass="LLN0">
<DO name="Mod" type="ENC_1_Mod"/>
<DO name="Beh" type="ENS_1_Beh"/>
<DO name="Health" type="ENS_2_Health"/>
<DO name="NamPlt" type="LPL_1_NamPlt"/>
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD">
<DO name="PhyNam" type="DPL_1_PhyNam"/>
<DO name="PhyHealth" type="ENS_2_Health"/>
<DO name="Proxy" type="SPS_1_Proxy"/>
</LNodeType>
<LNodeType id="GGIO1" lnClass="GGIO">
<DO name="Mod" type="ENC_1_Mod"/>
<DO name="Beh" type="ENS_1_Beh"/>
<DO name="Health" type="ENS_2_Health"/>
<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_1_SPCSO1"/>
<DO name="SPCSO2" type="SPC_2"/>
<DO name="SPCSO3" type="SPC_2"/>
<DO name="SPCSO4" type="SPC_2"/>
<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>
<LNodeType id="myLTRK" lnClass="LTRK">
<DO name="Beh" type="myENS_Beh" desc=""/>
<DO name="SpcTrk" type="myCTS_Bool" desc=""/>
<DO name="DpcTrk" type="myCTS_Bool" desc=""/>
<DO name="IncTrk" type="myCTS_Int32" desc=""/>
<DO name="BscTrk" type="myCTS_BSC" desc=""/>
<DO name="UrcbTrk" type="myUTS" desc=""/>
<DO name="BrcbTrk" type="myBTS" desc=""/>
<DO name="GocbTrk" type="myGTS" desc=""/>
</LNodeType>
<DOType id="myCTS_Bool" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="BOOLEAN" fc="SR" desc=""/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myCTS_Int32" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="INT32" fc="SR" desc="TINT32 control value"/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myCTS_BSC" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="ctlVal" bType="Tcmd" fc="SR" desc=""/>
<!-- <DA name="operTm" bType="Timestamp" fc="SR" desc=""/> -->
<DA name="origin" bType="Struct" type="Originator_1" fc="SR" desc=""/>
<DA name="ctlNum" bType="INT8U" fc="SR" desc=""/>
<DA name="T" bType="Timestamp" fc="SR" desc=""/>
<DA name="Test" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="Check" bType="Check" fc="SR" desc=""/>
<DA name="respAddCause" bType="Enum" type="AddCause" fc="SR" desc=""/>
</DOType>
<DOType id="myUTS" cdc="UTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="rptID" bType="VisString129" fc="SR" desc=""/>
<DA name="rptEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="resv" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="optFlds" bType="OptFlds" fc="SR" desc=""/>
<DA name="bufTm" bType="INT32U" fc="SR" desc=""/>
<DA name="sqNum" bType="INT8U" fc="SR" desc=""/>
<DA name="trgOps" bType="TrgOps" fc="SR" desc=""/>
<DA name="intgPd" bType="INT32U" fc="SR" desc=""/>
<DA name="gi" bType="BOOLEAN" fc="SR" desc=""/>
</DOType>
<DOType id="myBTS" cdc="BTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="rptID" bType="VisString129" fc="SR" desc=""/>
<DA name="rptEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="optFlds" bType="OptFlds" fc="SR" desc=""/>
<DA name="bufTm" bType="INT32U" fc="SR" desc=""/>
<DA name="sqNum" bType="INT16U" fc="SR" desc=""/>
<DA name="trgOps" bType="TrgOps" fc="SR" desc=""/>
<DA name="intgPd" bType="INT32U" fc="SR" desc=""/>
<DA name="gi" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="purgeBuf" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="entryID" bType="EntryID" fc="SR" desc=""/>
<DA name="timeOfEntry" bType="EntryTime" fc="SR" desc=""/>
<DA name="resvTms" bType="INT16" fc="SR" desc=""/>
</DOType>
<DOType id="myGTS" cdc="GTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="goEna" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="goID" bType="VisString129" fc="SR" desc=""/>
<DA name="datSet" bType="ObjRef" fc="SR" desc=""/>
<DA name="confRev" bType="INT32U" fc="SR" desc=""/>
<DA name="ndsCom" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="dstAddress" bType="PhyComAddr" fc="SR" desc=""/>
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="stVal" bType="Enum" type="Beh" 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="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="myENS_Beh" cdc="INS">
<DA name="stVal" bType="Enum" type="Beh" dchg="true" fc="ST"/>
<DA name="q" bType="Quality" qchg="true" fc="ST"/>
<DA name="t" bType="Timestamp" fc="ST"/>
</DOType>
<DOType id="ENS_2_Health" cdc="ENS">
<DA name="stVal" bType="Enum" type="HealthKind" 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="origin" fc="ST" type="Originator_1" bType="Struct"/>
<DA name="ctlNum" fc="ST" bType="INT8U"/>
<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"/>
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF"/>
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO"/>
</DOType>
<DOType id="SPC_2" 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="AddCause">
<EnumVal ord="0">Unknown</EnumVal>
<EnumVal ord="1">Not-supported</EnumVal>
<EnumVal ord="2">Blocked-by-switching-hierarchy</EnumVal>
<EnumVal ord="3">Select-failed</EnumVal>
<EnumVal ord="4">Invalid-position</EnumVal>
<EnumVal ord="5">Position-reached</EnumVal>
<EnumVal ord="6">Parameter-change-in-execution</EnumVal>
<EnumVal ord="7">Step-limit</EnumVal>
<EnumVal ord="8">Blocked-by-Mode</EnumVal>
<EnumVal ord="9">Blocked-by-process</EnumVal>
<EnumVal ord="10">Blocked-by-interlocking</EnumVal>
<EnumVal ord="11">Blocked-by-synchrocheck</EnumVal>
<EnumVal ord="12">Command-already-in-execution</EnumVal>
<EnumVal ord="13">Blocked-by-health</EnumVal>
<EnumVal ord="14">1-of-n-control</EnumVal>
<EnumVal ord="15">Abortion-by-cancel</EnumVal>
<EnumVal ord="16">Time-limit-over</EnumVal>
<EnumVal ord="17">Abortion-by-trip</EnumVal>
<EnumVal ord="18">Object-not-selected</EnumVal>
<EnumVal ord="19">Object-already-selected</EnumVal>
<EnumVal ord="20">No-access-authority</EnumVal>
<EnumVal ord="21">Ended-with-overshoot</EnumVal>
<EnumVal ord="22">Abortion-due-to-deviation</EnumVal>
<EnumVal ord="23">Abortion-by-communication-loss </EnumVal>
<EnumVal ord="24">Blocked-by-command</EnumVal>
<EnumVal ord="25">None</EnumVal>
<EnumVal ord="26">Inconsistent-parameters</EnumVal>
<EnumVal ord="27">Locked-by-other-client</EnumVal>
</EnumType>
<EnumType id="Beh">
<EnumVal ord="1">on</EnumVal>
<EnumVal ord="2">blocked</EnumVal>
<EnumVal ord="3">test</EnumVal>
<EnumVal ord="4">test/blocked</EnumVal>
<EnumVal ord="5">off</EnumVal>
</EnumType>
<EnumType id="HealthKind">
<EnumVal ord="1">ok</EnumVal>
<EnumVal ord="2">warning</EnumVal>
<EnumVal ord="3">alarm</EnumVal>
</EnumType>
<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>
<EnumType id="ServiceError">
<EnumVal ord="0">no-error</EnumVal>
<EnumVal ord="1">instance-not-available</EnumVal>
<EnumVal ord="2">instance-in-use</EnumVal>
<EnumVal ord="3">access-violation</EnumVal>
<EnumVal ord="4">access-not-allowed-in-current-state</EnumVal>
<EnumVal ord="5">parameter-value-inappropriate</EnumVal>
<EnumVal ord="6">parameter-value-inconsistent</EnumVal>
<EnumVal ord="7">class-not-supported</EnumVal>
<EnumVal ord="8">instance-locked-by-other-client</EnumVal>
<EnumVal ord="9">control-must-be-selected</EnumVal>
<EnumVal ord="10">type-conflict</EnumVal>
<EnumVal ord="11">failed-due-to-communications-constraint</EnumVal>
<EnumVal ord="12">failed-due-to-server-constraint</EnumVal>
</EnumType>
<EnumType id="ServiceType">
<EnumVal ord="0">Unknown</EnumVal>
<EnumVal ord="1">Associate</EnumVal>
<EnumVal ord="2">Abort</EnumVal>
<EnumVal ord="3">Release</EnumVal>
<EnumVal ord="4">GetServerDirectory</EnumVal>
<EnumVal ord="5">GetLogicalDeviceDirectory</EnumVal>
<EnumVal ord="6">GetAllDataValues</EnumVal>
<EnumVal ord="7">GetDataValues</EnumVal>
<EnumVal ord="8">SetDataValues</EnumVal>
<EnumVal ord="9">GetDataDirectory</EnumVal>
<EnumVal ord="10">GetDataDefinition</EnumVal>
<EnumVal ord="11">GetDataSetValues</EnumVal>
<EnumVal ord="12">SetDataSetValues</EnumVal>
<EnumVal ord="13">CreateDataSet</EnumVal>
<EnumVal ord="14">DeleteDataSet</EnumVal>
<EnumVal ord="15">GetDataSetDirectory</EnumVal>
<EnumVal ord="16">SelectActiveSG</EnumVal>
<EnumVal ord="17">SelectEditSG</EnumVal>
<EnumVal ord="18">SetEditSGValue</EnumVal>
<EnumVal ord="19">ConfirmEditSGValues</EnumVal>
<EnumVal ord="20">GetEditSGValue</EnumVal>
<EnumVal ord="21">GetSGCBValues</EnumVal>
<EnumVal ord="22">Report</EnumVal>
<EnumVal ord="23">GetBRCBValues</EnumVal>
<EnumVal ord="24">SetBRCBValues</EnumVal>
<EnumVal ord="25">GetURCBValues</EnumVal>
<EnumVal ord="26">SetURCBValues</EnumVal>
<EnumVal ord="27">GetLCBValues</EnumVal>
<EnumVal ord="28">SetLCBValues</EnumVal>
<EnumVal ord="29">QueryLogByTime</EnumVal>
<EnumVal ord="30">QueryLogAfter</EnumVal>
<EnumVal ord="31">GetLogStatus</EnumVal>
<EnumVal ord="32">SendGOOSEMessage</EnumVal>
<EnumVal ord="33">GetGoCBValues</EnumVal>
<EnumVal ord="34">SetGoCBValues</EnumVal>
<EnumVal ord="35">GetGoReference</EnumVal>
<EnumVal ord="36">GetGOOSEElementNumber</EnumVal>
<EnumVal ord="37">SendMSVMessage</EnumVal>
<EnumVal ord="38">GetMSVCBValues</EnumVal>
<EnumVal ord="39">SetMSVCBValues</EnumVal>
<EnumVal ord="40">SendUSVMessage</EnumVal>
<EnumVal ord="41">GetUSVCBValues</EnumVal>
<EnumVal ord="42">SetUSVCBValues</EnumVal>
<EnumVal ord="43">Select</EnumVal>
<EnumVal ord="44">SelectWithValue</EnumVal>
<EnumVal ord="45">Cancel</EnumVal>
<EnumVal ord="46">Operate</EnumVal>
<EnumVal ord="47">CommandTermination</EnumVal>
<EnumVal ord="48">TimeActivatedOperate</EnumVal>
<EnumVal ord="49">GetFile</EnumVal>
<EnumVal ord="50">SetFile</EnumVal>
<EnumVal ord="51">DeleteFile</EnumVal>
<EnumVal ord="52">GetFileAttributValues</EnumVal>
<EnumVal ord="53">TimeSynchronisation</EnumVal>
<EnumVal ord="54">InternalChange</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,609 @@
/*
* static_model.h
*
* automatically generated from simpleIO_ltrk_tests.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_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t;
extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel;
extern DataObject iedModel_GenericIO_GGIO1_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_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
extern 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 DataObject iedModel_GenericIO_GGIO1_SPCSO2;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO3;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
extern DataObject iedModel_GenericIO_GGIO1_Ind1;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t;
extern DataObject iedModel_GenericIO_GGIO1_Ind2;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t;
extern DataObject iedModel_GenericIO_GGIO1_Ind3;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t;
extern DataObject iedModel_GenericIO_GGIO1_Ind4;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
extern LogicalNode iedModel_GenericIO_LTRK1;
extern DataObject iedModel_GenericIO_LTRK1_Beh;
extern DataAttribute iedModel_GenericIO_LTRK1_Beh_stVal;
extern DataAttribute iedModel_GenericIO_LTRK1_Beh_q;
extern DataAttribute iedModel_GenericIO_LTRK1_Beh_t;
extern DataObject iedModel_GenericIO_LTRK1_SpcTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_ctlVal;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_origin;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_origin_orCat;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_origin_orIdent;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_ctlNum;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_T;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_Test;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_Check;
extern DataAttribute iedModel_GenericIO_LTRK1_SpcTrk_respAddCause;
extern DataObject iedModel_GenericIO_LTRK1_DpcTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_ctlVal;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_origin;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_origin_orCat;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_origin_orIdent;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_ctlNum;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_T;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_Test;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_Check;
extern DataAttribute iedModel_GenericIO_LTRK1_DpcTrk_respAddCause;
extern DataObject iedModel_GenericIO_LTRK1_IncTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_ctlVal;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_origin;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_origin_orCat;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_origin_orIdent;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_ctlNum;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_T;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_Test;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_Check;
extern DataAttribute iedModel_GenericIO_LTRK1_IncTrk_respAddCause;
extern DataObject iedModel_GenericIO_LTRK1_BscTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_ctlVal;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_origin;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_origin_orCat;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_origin_orIdent;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_ctlNum;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_T;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_Test;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_Check;
extern DataAttribute iedModel_GenericIO_LTRK1_BscTrk_respAddCause;
extern DataObject iedModel_GenericIO_LTRK1_UrcbTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_rptID;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_rptEna;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_resv;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_datSet;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_confRev;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_optFlds;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_bufTm;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_sqNum;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_trgOps;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_intgPd;
extern DataAttribute iedModel_GenericIO_LTRK1_UrcbTrk_gi;
extern DataObject iedModel_GenericIO_LTRK1_BrcbTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_rptID;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_rptEna;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_datSet;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_confRev;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_optFlds;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_bufTm;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_sqNum;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_trgOps;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_intgPd;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_gi;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_purgeBuf;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_entryID;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_timeOfEntry;
extern DataAttribute iedModel_GenericIO_LTRK1_BrcbTrk_resvTms;
extern DataObject iedModel_GenericIO_LTRK1_GocbTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_goEna;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_goID;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_datSet;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_confRev;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_ndsCom;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress;
#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_stVal (&iedModel_GenericIO_GGIO1_Mod_stVal)
#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q)
#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t)
#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_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_origin (&iedModel_GenericIO_GGIO1_SPCSO1_origin)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_origin_orCat)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_origin_orIdent)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_ctlNum)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_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_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)
#define IEDMODEL_GenericIO_LTRK1 (&iedModel_GenericIO_LTRK1)
#define IEDMODEL_GenericIO_LTRK1_Beh (&iedModel_GenericIO_LTRK1_Beh)
#define IEDMODEL_GenericIO_LTRK1_Beh_stVal (&iedModel_GenericIO_LTRK1_Beh_stVal)
#define IEDMODEL_GenericIO_LTRK1_Beh_q (&iedModel_GenericIO_LTRK1_Beh_q)
#define IEDMODEL_GenericIO_LTRK1_Beh_t (&iedModel_GenericIO_LTRK1_Beh_t)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk (&iedModel_GenericIO_LTRK1_SpcTrk)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_objRef (&iedModel_GenericIO_LTRK1_SpcTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_serviceType (&iedModel_GenericIO_LTRK1_SpcTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_errorCode (&iedModel_GenericIO_LTRK1_SpcTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_originatorID (&iedModel_GenericIO_LTRK1_SpcTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_t (&iedModel_GenericIO_LTRK1_SpcTrk_t)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_d (&iedModel_GenericIO_LTRK1_SpcTrk_d)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_dU (&iedModel_GenericIO_LTRK1_SpcTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_cdcNs (&iedModel_GenericIO_LTRK1_SpcTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_cdcName (&iedModel_GenericIO_LTRK1_SpcTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_dataNs (&iedModel_GenericIO_LTRK1_SpcTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_ctlVal (&iedModel_GenericIO_LTRK1_SpcTrk_ctlVal)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_origin (&iedModel_GenericIO_LTRK1_SpcTrk_origin)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_origin_orCat (&iedModel_GenericIO_LTRK1_SpcTrk_origin_orCat)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_origin_orIdent (&iedModel_GenericIO_LTRK1_SpcTrk_origin_orIdent)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_ctlNum (&iedModel_GenericIO_LTRK1_SpcTrk_ctlNum)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_T (&iedModel_GenericIO_LTRK1_SpcTrk_T)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_Test (&iedModel_GenericIO_LTRK1_SpcTrk_Test)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_Check (&iedModel_GenericIO_LTRK1_SpcTrk_Check)
#define IEDMODEL_GenericIO_LTRK1_SpcTrk_respAddCause (&iedModel_GenericIO_LTRK1_SpcTrk_respAddCause)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk (&iedModel_GenericIO_LTRK1_DpcTrk)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_objRef (&iedModel_GenericIO_LTRK1_DpcTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_serviceType (&iedModel_GenericIO_LTRK1_DpcTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_errorCode (&iedModel_GenericIO_LTRK1_DpcTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_originatorID (&iedModel_GenericIO_LTRK1_DpcTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_t (&iedModel_GenericIO_LTRK1_DpcTrk_t)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_d (&iedModel_GenericIO_LTRK1_DpcTrk_d)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_dU (&iedModel_GenericIO_LTRK1_DpcTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_cdcNs (&iedModel_GenericIO_LTRK1_DpcTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_cdcName (&iedModel_GenericIO_LTRK1_DpcTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_dataNs (&iedModel_GenericIO_LTRK1_DpcTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_ctlVal (&iedModel_GenericIO_LTRK1_DpcTrk_ctlVal)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_origin (&iedModel_GenericIO_LTRK1_DpcTrk_origin)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_origin_orCat (&iedModel_GenericIO_LTRK1_DpcTrk_origin_orCat)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_origin_orIdent (&iedModel_GenericIO_LTRK1_DpcTrk_origin_orIdent)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_ctlNum (&iedModel_GenericIO_LTRK1_DpcTrk_ctlNum)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_T (&iedModel_GenericIO_LTRK1_DpcTrk_T)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_Test (&iedModel_GenericIO_LTRK1_DpcTrk_Test)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_Check (&iedModel_GenericIO_LTRK1_DpcTrk_Check)
#define IEDMODEL_GenericIO_LTRK1_DpcTrk_respAddCause (&iedModel_GenericIO_LTRK1_DpcTrk_respAddCause)
#define IEDMODEL_GenericIO_LTRK1_IncTrk (&iedModel_GenericIO_LTRK1_IncTrk)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_objRef (&iedModel_GenericIO_LTRK1_IncTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_serviceType (&iedModel_GenericIO_LTRK1_IncTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_errorCode (&iedModel_GenericIO_LTRK1_IncTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_originatorID (&iedModel_GenericIO_LTRK1_IncTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_t (&iedModel_GenericIO_LTRK1_IncTrk_t)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_d (&iedModel_GenericIO_LTRK1_IncTrk_d)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_dU (&iedModel_GenericIO_LTRK1_IncTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_cdcNs (&iedModel_GenericIO_LTRK1_IncTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_cdcName (&iedModel_GenericIO_LTRK1_IncTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_dataNs (&iedModel_GenericIO_LTRK1_IncTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_ctlVal (&iedModel_GenericIO_LTRK1_IncTrk_ctlVal)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_origin (&iedModel_GenericIO_LTRK1_IncTrk_origin)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_origin_orCat (&iedModel_GenericIO_LTRK1_IncTrk_origin_orCat)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_origin_orIdent (&iedModel_GenericIO_LTRK1_IncTrk_origin_orIdent)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_ctlNum (&iedModel_GenericIO_LTRK1_IncTrk_ctlNum)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_T (&iedModel_GenericIO_LTRK1_IncTrk_T)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_Test (&iedModel_GenericIO_LTRK1_IncTrk_Test)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_Check (&iedModel_GenericIO_LTRK1_IncTrk_Check)
#define IEDMODEL_GenericIO_LTRK1_IncTrk_respAddCause (&iedModel_GenericIO_LTRK1_IncTrk_respAddCause)
#define IEDMODEL_GenericIO_LTRK1_BscTrk (&iedModel_GenericIO_LTRK1_BscTrk)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_objRef (&iedModel_GenericIO_LTRK1_BscTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_serviceType (&iedModel_GenericIO_LTRK1_BscTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_errorCode (&iedModel_GenericIO_LTRK1_BscTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_originatorID (&iedModel_GenericIO_LTRK1_BscTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_t (&iedModel_GenericIO_LTRK1_BscTrk_t)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_d (&iedModel_GenericIO_LTRK1_BscTrk_d)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_dU (&iedModel_GenericIO_LTRK1_BscTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_cdcNs (&iedModel_GenericIO_LTRK1_BscTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_cdcName (&iedModel_GenericIO_LTRK1_BscTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_dataNs (&iedModel_GenericIO_LTRK1_BscTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_ctlVal (&iedModel_GenericIO_LTRK1_BscTrk_ctlVal)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_origin (&iedModel_GenericIO_LTRK1_BscTrk_origin)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_origin_orCat (&iedModel_GenericIO_LTRK1_BscTrk_origin_orCat)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_origin_orIdent (&iedModel_GenericIO_LTRK1_BscTrk_origin_orIdent)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_ctlNum (&iedModel_GenericIO_LTRK1_BscTrk_ctlNum)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_T (&iedModel_GenericIO_LTRK1_BscTrk_T)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_Test (&iedModel_GenericIO_LTRK1_BscTrk_Test)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_Check (&iedModel_GenericIO_LTRK1_BscTrk_Check)
#define IEDMODEL_GenericIO_LTRK1_BscTrk_respAddCause (&iedModel_GenericIO_LTRK1_BscTrk_respAddCause)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk (&iedModel_GenericIO_LTRK1_UrcbTrk)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_objRef (&iedModel_GenericIO_LTRK1_UrcbTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_serviceType (&iedModel_GenericIO_LTRK1_UrcbTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_errorCode (&iedModel_GenericIO_LTRK1_UrcbTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_originatorID (&iedModel_GenericIO_LTRK1_UrcbTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_t (&iedModel_GenericIO_LTRK1_UrcbTrk_t)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_d (&iedModel_GenericIO_LTRK1_UrcbTrk_d)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_dU (&iedModel_GenericIO_LTRK1_UrcbTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_cdcNs (&iedModel_GenericIO_LTRK1_UrcbTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_cdcName (&iedModel_GenericIO_LTRK1_UrcbTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_dataNs (&iedModel_GenericIO_LTRK1_UrcbTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_rptID (&iedModel_GenericIO_LTRK1_UrcbTrk_rptID)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_rptEna (&iedModel_GenericIO_LTRK1_UrcbTrk_rptEna)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_resv (&iedModel_GenericIO_LTRK1_UrcbTrk_resv)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_datSet (&iedModel_GenericIO_LTRK1_UrcbTrk_datSet)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_confRev (&iedModel_GenericIO_LTRK1_UrcbTrk_confRev)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_optFlds (&iedModel_GenericIO_LTRK1_UrcbTrk_optFlds)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_bufTm (&iedModel_GenericIO_LTRK1_UrcbTrk_bufTm)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_sqNum (&iedModel_GenericIO_LTRK1_UrcbTrk_sqNum)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_trgOps (&iedModel_GenericIO_LTRK1_UrcbTrk_trgOps)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_intgPd (&iedModel_GenericIO_LTRK1_UrcbTrk_intgPd)
#define IEDMODEL_GenericIO_LTRK1_UrcbTrk_gi (&iedModel_GenericIO_LTRK1_UrcbTrk_gi)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk (&iedModel_GenericIO_LTRK1_BrcbTrk)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_objRef (&iedModel_GenericIO_LTRK1_BrcbTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_serviceType (&iedModel_GenericIO_LTRK1_BrcbTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_errorCode (&iedModel_GenericIO_LTRK1_BrcbTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_originatorID (&iedModel_GenericIO_LTRK1_BrcbTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_t (&iedModel_GenericIO_LTRK1_BrcbTrk_t)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_d (&iedModel_GenericIO_LTRK1_BrcbTrk_d)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_dU (&iedModel_GenericIO_LTRK1_BrcbTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_cdcNs (&iedModel_GenericIO_LTRK1_BrcbTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_cdcName (&iedModel_GenericIO_LTRK1_BrcbTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_dataNs (&iedModel_GenericIO_LTRK1_BrcbTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_rptID (&iedModel_GenericIO_LTRK1_BrcbTrk_rptID)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_rptEna (&iedModel_GenericIO_LTRK1_BrcbTrk_rptEna)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_datSet (&iedModel_GenericIO_LTRK1_BrcbTrk_datSet)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_confRev (&iedModel_GenericIO_LTRK1_BrcbTrk_confRev)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_optFlds (&iedModel_GenericIO_LTRK1_BrcbTrk_optFlds)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_bufTm (&iedModel_GenericIO_LTRK1_BrcbTrk_bufTm)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_sqNum (&iedModel_GenericIO_LTRK1_BrcbTrk_sqNum)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_trgOps (&iedModel_GenericIO_LTRK1_BrcbTrk_trgOps)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_intgPd (&iedModel_GenericIO_LTRK1_BrcbTrk_intgPd)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_gi (&iedModel_GenericIO_LTRK1_BrcbTrk_gi)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_purgeBuf (&iedModel_GenericIO_LTRK1_BrcbTrk_purgeBuf)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_entryID (&iedModel_GenericIO_LTRK1_BrcbTrk_entryID)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_timeOfEntry (&iedModel_GenericIO_LTRK1_BrcbTrk_timeOfEntry)
#define IEDMODEL_GenericIO_LTRK1_BrcbTrk_resvTms (&iedModel_GenericIO_LTRK1_BrcbTrk_resvTms)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk (&iedModel_GenericIO_LTRK1_GocbTrk)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_objRef (&iedModel_GenericIO_LTRK1_GocbTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_serviceType (&iedModel_GenericIO_LTRK1_GocbTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_errorCode (&iedModel_GenericIO_LTRK1_GocbTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_originatorID (&iedModel_GenericIO_LTRK1_GocbTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_t (&iedModel_GenericIO_LTRK1_GocbTrk_t)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_d (&iedModel_GenericIO_LTRK1_GocbTrk_d)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_dU (&iedModel_GenericIO_LTRK1_GocbTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_cdcNs (&iedModel_GenericIO_LTRK1_GocbTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_cdcName (&iedModel_GenericIO_LTRK1_GocbTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_dataNs (&iedModel_GenericIO_LTRK1_GocbTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_goEna (&iedModel_GenericIO_LTRK1_GocbTrk_goEna)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_goID (&iedModel_GenericIO_LTRK1_GocbTrk_goID)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_datSet (&iedModel_GenericIO_LTRK1_GocbTrk_datSet)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_confRev (&iedModel_GenericIO_LTRK1_GocbTrk_confRev)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_ndsCom (&iedModel_GenericIO_LTRK1_GocbTrk_ndsCom)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_dstAddress (&iedModel_GenericIO_LTRK1_GocbTrk_dstAddress)
#endif /* STATIC_MODEL_H_ */

@ -1,7 +1,7 @@
/*
* mms_mapping_internal.h
*
* Copyright 2013-2018 Michael Zillgith
* Copyright 2013-2020 Michael Zillgith
*
* This file is part of libIEC61850.
*
@ -29,6 +29,151 @@
#include "hal_thread.h"
#include "linked_list.h"
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
typedef int IEC61850_ServiceType;
#define IEC61850_SERVICE_TYPE_UNKOWN 0
#define IEC61850_SERVICE_TYPE_ASSOCIATE 1
#define IEC61850_SERVICE_TYPE_ABORT 2
#define IEC61850_SERVICE_TYPE_RELEASE 3
#define IEC61850_SERVICE_TYPE_GET_SERVER_DIRECTORY 4
#define IEC61850_SERVICE_TYPE_GET_LOGICAL_DEVICE_DIRECTORY 5
#define IEC61850_SERVICE_TYPE_GET_ALL_DATA_VALUES 6
#define IEC61850_SERVICE_TYPE_GET_DATA_VALUES 7
#define IEC61850_SERVICE_TYPE_SET_DATA_VALUES 8
#define IEC61850_SERVICE_TYPE_GET_DATA_DIRECTORY 9
#define IEC61850_SERVICE_TYPE_GET_DATA_DEFINITION 10
#define IEC61850_SERVICE_TYPE_GET_DATA_SET_VALUES 11
#define IEC61850_SERVICE_TYPE_SET_DATA_SET_VALUES 12
#define IEC61850_SERVICE_TYPE_CREATE_DATA_SET 13
#define IEC61850_SERVICE_TYPE_DELETE_DATA_SET 14
#define IEC61850_SERVICE_TYPE_GET_DATA_SET_DIRECTORY 15
#define IEC61850_SERVICE_TYPE_SELECT_ACTIVE_SG 16
#define IEC61850_SERVICE_TYPE_SELECT_EDIT_SG 17
#define IEC61850_SERVICE_TYPE_SET_EDIT_SG_VALUE 18
#define IEC61850_SERVICE_TYPE_CONFIRM_EDIT_SG_VALUES 19
#define IEC61850_SERVICE_TYPE_GET_EDIT_SG_VALUE 20
#define IEC61850_SERVICE_TYPE_GET_SGCB_VALUES 21
#define IEC61850_SERVICE_TYPE_REPORT 22
#define IEC61850_SERVICE_TYPE_GET_BRCB_VALUES 23
#define IEC61850_SERVICE_TYPE_SET_BRCB_VALUES 24
#define IEC61850_SERVICE_TYPE_GET_URCB_VALUES 25
#define IEC61850_SERVICE_TYPE_SET_URCB_VALUES 26
#define IEC61850_SERVICE_TYPE_GET_LCB_VALUES 27
#define IEC61850_SERVICE_TYPE_SET_LCB_VALUES 28
#define IEC61850_SERVICE_TYPE_QUERY_LOG_BY_TIME 29
#define IEC61850_SERVICE_TYPE_QUERY_LOG_AFTER 30
#define IEC61850_SERVICE_TYPE_GET_LOG_STATUS 31
#define IEC61850_SERVICE_TYPE_SEND_GOOSE_MESSAGE 32
#define IEC61850_SERVICE_TYPE_GET_GOCB_VALUES 33
#define IEC61850_SERVICE_TYPE_SET_GOCB_VALUES 34
#define IEC61850_SERVICE_TYPE_GET_GO_REFERENCE 35
#define IEC61850_SERVICE_TYPE_GET_GOOSE_ELEMENT_NUMBER 36
#define IEC61850_SERVICE_TYPE_SEND_MSV_MESSAGE 37
#define IEC61850_SERVICE_TYPE_GET_MSVCB_VALUES 38
#define IEC61850_SERVICE_TYPE_SET_MSVCB_VALUES 39
#define IEC61850_SERVICE_TYPE_SEND_USV_MESSAGE 40
#define IEC61850_SERVICE_TYPE_GET_USVCB_VALUES 41
#define IEC61850_SERVICE_TYPE_SET_USVCB_VALUES 42
#define IEC61850_SERVICE_TYPE_SELECT 43
#define IEC61850_SERVICE_TYPE_SELECT_WITH_VALUES 44
#define IEC61850_SERVICE_TYPE_CANCEL 45
#define IEC61850_SERVICE_TYPE_OPERATE 46
#define IEC61850_SERVICE_TYPE_COMMAND_TERMINATION 47
#define IEC61850_SERVICE_TYPE_TIME_ACTIVATED_OPERATE 48
#define IEC61850_SERVICE_TYPE_GET_FILE 49
#define IEC61850_SERVICE_TYPE_SET_FILE 50
#define IEC61850_SERVICE_TYPE_DELETE_FILE 51
#define IEC61850_SERVICE_TYPE_GET_FILE_ATTRIBUTE_VALUES 52
#define IEC61850_SERVICE_TYPE_TIME_SYNCHRONISATION 53
#define IEC61850_SERVICE_TYPE_INTERNAL_CHANGE 54
typedef int IEC61850_ServiceError;
#define IEC61850_SERVICE_ERROR_NO_ERROR 0
#define IEC61850_SERVICE_ERROR_INSTANCE_NOT_AVAILABLE 1
#define IEC61850_SERVICE_ERROR_INSTANCE_IN_USE 2
#define IEC61850_SERVICE_ERROR_ACCESS_VIOLATION 3
#define IEC61850_SERVICE_ERROR_ACCESS_NOT_ALLOWED_IN_CURRENT_STATE 4
#define IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INAPPROPRIATE 5
#define IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INCONSISTENT 6
#define IEC61850_SERVICE_ERROR_CLASS_NOT_SUPPORTED 7
#define IEC61850_SERVICE_ERROR_INSTANCE_LOCKED_BY_OTHER_CLIENT 8
#define IEC61850_SERVICE_ERROR_CONTROL_MUST_BE_SELECTED 9
#define IEC61850_SERVICE_ERROR_TYPE_CONFLICT 10
#define IEC61850_SERVICE_ERROR_FAILED_DUE_TO_COMMUNICATION_CONSTRAINT 11
#define IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT 12
typedef struct sServiceTrkInstance* ServiceTrkInstance;
struct sServiceTrkInstance
{
DataObject* dobj;
DataAttribute* objRef;
DataAttribute* serviceType;
DataAttribute* errorCode;
DataAttribute* originatorID; /* optional */
DataAttribute* t;
};
typedef struct sBrcbTrkInstance* BrcbTrkInstance;
struct sBrcbTrkInstance
{
/* inherited from ServiceTrkInstance */
DataObject* dobj;
DataAttribute* objRef;
DataAttribute* serviceType;
DataAttribute* errorCode;
DataAttribute* originatorID; /* optional */
DataAttribute* t;
/* BrcbTrk specific attributes */
DataAttribute* rptID;
DataAttribute* rptEna;
DataAttribute* datSet;
DataAttribute* confRev;
DataAttribute* optFlds;
DataAttribute* bufTm;
DataAttribute* sqNum;
DataAttribute* trgOps;
DataAttribute* intgPd;
DataAttribute* gi;
DataAttribute* purgeBuf;
DataAttribute* entryID;
DataAttribute* timeOfEntry;
DataAttribute* resvTms; /* optional */
};
typedef struct sUrcbTrkInstance* UrcbTrkInstance;
struct sUrcbTrkInstance
{
/* inherited from ServiceTrkInstance */
DataObject* dobj;
DataAttribute* objRef;
DataAttribute* serviceType;
DataAttribute* errorCode;
DataAttribute* originatorID; /* optional */
DataAttribute* t;
/* UrcbTrk specific attributes */
DataAttribute* rptID;
DataAttribute* rptEna;
DataAttribute* resv;
DataAttribute* datSet;
DataAttribute* confRev;
DataAttribute* optFlds;
DataAttribute* bufTm;
DataAttribute* sqNum;
DataAttribute* trgOps;
DataAttribute* intgPd;
DataAttribute* gi;
};
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
struct sMmsMapping {
IedModel* model;
MmsDevice* mmsDevice;
@ -68,6 +213,13 @@ struct sMmsMapping {
Thread reportWorkerThread;
#endif
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
BrcbTrkInstance brcbTrk;
UrcbTrkInstance urcbTrk;
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
/* flag indicates if data model is locked --> prevents reports to be sent */
bool isModelLocked;

@ -132,7 +132,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme
MmsServerConnection connection);
LIB61850_INTERNAL void
ReportControl_readAccess(ReportControl* rc, char* elementName);
ReportControl_readAccess(ReportControl* rc, MmsMapping* mmsMapping, char* elementName);
LIB61850_INTERNAL void
Reporting_activateBufferedReports(MmsMapping* self);

@ -856,6 +856,241 @@ checkForSgcb(MmsMapping* self, LogicalNode* logicalNode)
#endif /* (CONFIG_IEC61850_SETTING_GROUPS == 1) */
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
static void
getCommonTrackingAttributes(ServiceTrkInstance svcTrkInst, DataObject* trkObj)
{
ModelNode* modelNode = trkObj->firstChild;
while (modelNode) {
if (modelNode->modelType == DataAttributeModelType) {
DataAttribute* da = (DataAttribute*) modelNode;
if (!strcmp(da->name, "objRef")) {
svcTrkInst->objRef = da;
}
else if (!strcmp(da->name, "serviceType")) {
svcTrkInst->serviceType = da;
}
else if (!strcmp(da->name, "errorCode")) {
svcTrkInst->errorCode = da;
}
else if (!strcmp(da->name, "originatorID")) {
svcTrkInst->originatorID = da;
}
else if (!strcmp(da->name, "t")) {
svcTrkInst->t = da;
}
}
modelNode = modelNode->sibling;
}
/* check if all mandatory attributes are present */
if (svcTrkInst->objRef && svcTrkInst->serviceType && svcTrkInst->errorCode && svcTrkInst->t) {
}
else {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: required attribute missing in service tracking object %s\n",trkObj->name);
}
}
static void
getBrcbTrackingAttributes(BrcbTrkInstance svcTrkInst, DataObject* trkObj)
{
ModelNode* modelNode = trkObj->firstChild;
while (modelNode) {
if (modelNode->modelType == DataAttributeModelType) {
DataAttribute* da = (DataAttribute*) modelNode;
if (!strcmp(da->name, "rptID")) {
svcTrkInst->rptID = da;
}
else if (!strcmp(da->name, "rptEna")) {
svcTrkInst->rptEna = da;
}
else if (!strcmp(da->name, "datSet")) {
svcTrkInst->datSet = da;
}
else if (!strcmp(da->name, "confRev")) {
svcTrkInst->confRev = da;
}
else if (!strcmp(da->name, "optFlds")) {
svcTrkInst->optFlds = da;
}
else if (!strcmp(da->name, "bufTm")) {
svcTrkInst->bufTm = da;
}
else if (!strcmp(da->name, "sqNum")) {
svcTrkInst->sqNum = da;
}
else if (!strcmp(da->name, "trgOps")) {
svcTrkInst->trgOps = da;
}
else if (!strcmp(da->name, "intgPd")) {
svcTrkInst->intgPd = da;
}
else if (!strcmp(da->name, "gi")) {
svcTrkInst->gi = da;
}
else if (!strcmp(da->name, "purgeBuf")) {
svcTrkInst->purgeBuf = da;
}
else if (!strcmp(da->name, "entryID")) {
svcTrkInst->entryID = da;
}
else if (!strcmp(da->name, "timeOfEntry")) {
svcTrkInst->timeOfEntry = da;
}
else if (!strcmp(da->name, "resvTms")) {
svcTrkInst->resvTms = da;
}
}
modelNode = modelNode->sibling;
}
/* check if all mandatory attributes are present */
if (svcTrkInst->rptID && svcTrkInst->rptEna && svcTrkInst->datSet && svcTrkInst->confRev &&
svcTrkInst->optFlds && svcTrkInst->bufTm && svcTrkInst->sqNum && svcTrkInst->trgOps &&
svcTrkInst->intgPd && svcTrkInst->gi && svcTrkInst->purgeBuf && svcTrkInst->entryID &&
svcTrkInst->timeOfEntry) {
}
else {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: required attribute missing in brcbTrk service tracking object %s\n",trkObj->name);
}
}
static void
getUrcbTrackingAttributes(UrcbTrkInstance svcTrkInst, DataObject* trkObj)
{
ModelNode* modelNode = trkObj->firstChild;
while (modelNode) {
if (modelNode->modelType == DataAttributeModelType) {
DataAttribute* da = (DataAttribute*) modelNode;
if (!strcmp(da->name, "rptID")) {
svcTrkInst->rptID = da;
}
else if (!strcmp(da->name, "rptEna")) {
svcTrkInst->rptEna = da;
}
else if (!strcmp(da->name, "resv")) {
svcTrkInst->resv = da;
}
else if (!strcmp(da->name, "datSet")) {
svcTrkInst->datSet = da;
}
else if (!strcmp(da->name, "confRev")) {
svcTrkInst->confRev = da;
}
else if (!strcmp(da->name, "optFlds")) {
svcTrkInst->optFlds = da;
}
else if (!strcmp(da->name, "bufTm")) {
svcTrkInst->bufTm = da;
}
else if (!strcmp(da->name, "sqNum")) {
svcTrkInst->sqNum = da;
}
else if (!strcmp(da->name, "trgOps")) {
svcTrkInst->trgOps = da;
}
else if (!strcmp(da->name, "intgPd")) {
svcTrkInst->intgPd = da;
}
else if (!strcmp(da->name, "gi")) {
svcTrkInst->gi = da;
}
}
modelNode = modelNode->sibling;
}
/* check if all mandatory attributes are present */
if (svcTrkInst->rptID && svcTrkInst->rptEna && svcTrkInst->datSet && svcTrkInst->confRev &&
svcTrkInst->optFlds && svcTrkInst->bufTm && svcTrkInst->sqNum && svcTrkInst->trgOps &&
svcTrkInst->intgPd && svcTrkInst->gi && svcTrkInst->resv) {
}
else {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: required attribute missing in urcbTrk service tracking object %s\n",trkObj->name);
}
}
static void
checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
{
ModelNode* modelNode = logicalNode->firstChild;
while (modelNode) {
if (!strcmp(modelNode->name, "SpcTrk")) {
if (DEBUG_IED_SERVER)
printf("SpcTrk data object found!\n");
}
else if (!strcmp(modelNode->name, "BrcbTrk")) {
if (DEBUG_IED_SERVER)
printf("BrcbTrk data object found!\n");
DataObject* brcbTrk = (DataObject*) modelNode;
if (self->brcbTrk) {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: ERROR: multiple BrcbTrk instances found in server\n");
}
else {
/* Setup BrcbTrk references */
self->brcbTrk = (BrcbTrkInstance) GLOBAL_CALLOC(1, sizeof(struct sBrcbTrkInstance));
if (self->brcbTrk) {
self->brcbTrk->dobj = brcbTrk;
getCommonTrackingAttributes((ServiceTrkInstance) self->brcbTrk, brcbTrk);
getBrcbTrackingAttributes(self->brcbTrk, brcbTrk);
}
}
}
else if (!strcmp(modelNode->name, "UrcbTrk")) {
if (DEBUG_IED_SERVER)
printf("UrcbTrk data object found!\n");
DataObject* urcbTrk = (DataObject*) modelNode;
if (self->urcbTrk) {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: ERROR: multiple UrcbTrk instances found in server\n");
}
else {
/* Setup BrcbTrk references */
self->urcbTrk = (UrcbTrkInstance) GLOBAL_CALLOC(1, sizeof(struct sUrcbTrkInstance));
if (self->urcbTrk) {
self->urcbTrk->dobj = urcbTrk;
getCommonTrackingAttributes((ServiceTrkInstance) self->urcbTrk, urcbTrk);
getUrcbTrackingAttributes(self->urcbTrk, urcbTrk);
}
}
}
modelNode = modelNode->sibling;
}
}
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
static MmsVariableSpecification*
createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain,
@ -1103,6 +1338,20 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain,
if (LogicalNode_hasFCData(logicalNode, IEC61850_FC_SR)) {
namedVariable->typeSpec.structure.elements[currentComponent] =
createFCNamedVariable(logicalNode, IEC61850_FC_SR);
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
if (DEBUG_IED_SERVER)
printf("Service tracking elements detected\n");
/* TODO set flag to enable service tracking */
MmsVariableSpecification* trackingVariables = namedVariable->typeSpec.structure.elements[currentComponent];
checkForServiceTrackingVariables(self, logicalNode);
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
currentComponent++;
}
@ -2339,7 +2588,7 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo
char* elementName = MmsMapping_getNextNameElement(reportName);
ReportControl_readAccess(rc, elementName);
ReportControl_readAccess(rc, self, elementName);
MmsValue* value = NULL;

@ -308,6 +308,257 @@ ReportControl_getRCBValue(ReportControl* rc, char* elementName)
return NULL ;
}
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
static void
copyRCBValuesToTrackingObject(MmsMapping* self, ReportControl* rc)
{
if (rc->buffered) {
if (self->brcbTrk) {
BrcbTrkInstance trkInst = self->brcbTrk;
if (trkInst->rptID)
MmsValue_update(trkInst->rptID->mmsValue, ReportControl_getRCBValue(rc, "RptID"));
if (trkInst->rptEna)
MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "RptEna"));
if (trkInst->datSet)
MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet"));
if (trkInst->confRev)
MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev"));
if (trkInst->optFlds)
MmsValue_update(trkInst->optFlds->mmsValue, ReportControl_getRCBValue(rc, "OptFlds"));
if (trkInst->bufTm)
MmsValue_update(trkInst->bufTm->mmsValue, ReportControl_getRCBValue(rc, "BufTm"));
if (trkInst->sqNum)
MmsValue_update(trkInst->sqNum->mmsValue, ReportControl_getRCBValue(rc, "SqNum"));
if (trkInst->trgOps)
MmsValue_update(trkInst->trgOps->mmsValue, ReportControl_getRCBValue(rc, "TrgOps"));
if (trkInst->intgPd)
MmsValue_update(trkInst->intgPd->mmsValue, ReportControl_getRCBValue(rc, "IntgPd"));
if (trkInst->gi)
MmsValue_update(trkInst->gi->mmsValue, ReportControl_getRCBValue(rc, "GI"));
if (trkInst->purgeBuf)
MmsValue_update(trkInst->purgeBuf->mmsValue, ReportControl_getRCBValue(rc, "PurgeBuf"));
if (trkInst->entryID)
MmsValue_update(trkInst->entryID->mmsValue, ReportControl_getRCBValue(rc, "EntryID"));
if (trkInst->timeOfEntry) {
MmsValue* timeofEntryValue = ReportControl_getRCBValue(rc, "TimeofEntry");
if (timeofEntryValue)
MmsValue_update(trkInst->timeOfEntry->mmsValue, timeofEntryValue);
}
if (trkInst->resvTms) {
MmsValue* resvTmsValue = ReportControl_getRCBValue(rc, "ResvTms");
if (resvTmsValue)
MmsValue_update(trkInst->resvTms->mmsValue, resvTmsValue);
}
}
}
else {
if (self->urcbTrk) {
UrcbTrkInstance trkInst = self->urcbTrk;
if (trkInst->rptID)
MmsValue_update(trkInst->rptID->mmsValue, ReportControl_getRCBValue(rc, "RptID"));
if (trkInst->rptEna)
MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "RptEna"));
if (trkInst->resv)
MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "Resv"));
if (trkInst->datSet)
MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet"));
if (trkInst->confRev)
MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev"));
if (trkInst->optFlds)
MmsValue_update(trkInst->optFlds->mmsValue, ReportControl_getRCBValue(rc, "OptFlds"));
if (trkInst->bufTm)
MmsValue_update(trkInst->bufTm->mmsValue, ReportControl_getRCBValue(rc, "BufTm"));
if (trkInst->sqNum)
MmsValue_update(trkInst->sqNum->mmsValue, ReportControl_getRCBValue(rc, "SqNum"));
if (trkInst->trgOps)
MmsValue_update(trkInst->trgOps->mmsValue, ReportControl_getRCBValue(rc, "TrgOps"));
if (trkInst->intgPd)
MmsValue_update(trkInst->intgPd->mmsValue, ReportControl_getRCBValue(rc, "IntgPd"));
if (trkInst->gi)
MmsValue_update(trkInst->gi->mmsValue, ReportControl_getRCBValue(rc, "GI"));
}
}
}
static void
updateSingleTrackingValue(MmsMapping* self, ReportControl* rc, char* name, MmsValue* newValue)
{
if (rc->buffered) {
if (self->brcbTrk) {
BrcbTrkInstance trkInst = self->brcbTrk;
DataAttribute* attributeToUpdate = NULL;
if (!strcmp(name, "RptID"))
attributeToUpdate = trkInst->rptID;
else if (!strcmp(name, "RptEna"))
attributeToUpdate = trkInst->rptEna;
else if (!strcmp(name, "DatSet"))
attributeToUpdate = trkInst->datSet;
else if (!strcmp(name, "ConfRev"))
attributeToUpdate = trkInst->confRev;
else if (!strcmp(name, "OptFlds"))
attributeToUpdate = trkInst->optFlds;
else if (!strcmp(name, "BufTm"))
attributeToUpdate = trkInst->bufTm;
else if (!strcmp(name, "SqNum"))
attributeToUpdate = trkInst->sqNum;
else if (!strcmp(name, "TrgOps"))
attributeToUpdate = trkInst->trgOps;
else if (!strcmp(name, "IntgPd"))
attributeToUpdate = trkInst->intgPd;
else if (!strcmp(name, "GI"))
attributeToUpdate = trkInst->gi;
else if (!strcmp(name, "PurgeBuf"))
attributeToUpdate = trkInst->purgeBuf;
else if (!strcmp(name, "TimeofEntry"))
attributeToUpdate = trkInst->timeOfEntry;
else if (!strcmp(name, "EntryID"))
attributeToUpdate = trkInst->entryID;
else if (!strcmp(name, "ResvTms"))
attributeToUpdate = trkInst->resvTms;
if (attributeToUpdate)
MmsValue_update(attributeToUpdate->mmsValue, newValue);
}
}
else {
if (self->urcbTrk) {
UrcbTrkInstance trkInst = self->urcbTrk;
DataAttribute* attributeToUpdate = NULL;
if (!strcmp(name, "RptID"))
attributeToUpdate = trkInst->rptID;
else if (!strcmp(name, "RptEna"))
attributeToUpdate = trkInst->rptEna;
else if (!strcmp(name, "Resv"))
attributeToUpdate = trkInst->resv;
else if (!strcmp(name, "DatSet"))
attributeToUpdate = trkInst->datSet;
else if (!strcmp(name, "ConfRev"))
attributeToUpdate = trkInst->confRev;
else if (!strcmp(name, "OptFlds"))
attributeToUpdate = trkInst->optFlds;
else if (!strcmp(name, "BufTm"))
attributeToUpdate = trkInst->bufTm;
else if (!strcmp(name, "SqNum"))
attributeToUpdate = trkInst->sqNum;
else if (!strcmp(name, "TrgOps"))
attributeToUpdate = trkInst->trgOps;
else if (!strcmp(name, "IntgPd"))
attributeToUpdate = trkInst->intgPd;
else if (!strcmp(name, "GI"))
attributeToUpdate = trkInst->gi;
if (attributeToUpdate)
MmsValue_update(attributeToUpdate->mmsValue, newValue);
}
}
}
static IEC61850_ServiceError
convertMmsDataAccessErrorToServiceError(MmsDataAccessError mmsError)
{
IEC61850_ServiceError errVal = IEC61850_SERVICE_ERROR_NO_ERROR;
switch (mmsError) {
case DATA_ACCESS_ERROR_SUCCESS:
break;
case DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE:
errVal = IEC61850_SERVICE_ERROR_INSTANCE_LOCKED_BY_OTHER_CLIENT;
break;
case DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED:
errVal = IEC61850_SERVICE_ERROR_ACCESS_VIOLATION;
break;
case DATA_ACCESS_ERROR_TYPE_INCONSISTENT:
errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INCONSISTENT;
break;
case DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT:
errVal = IEC61850_SERVICE_ERROR_INSTANCE_NOT_AVAILABLE;
break;
default:
printf("Data access error %i not mapped!\n", mmsError);
errVal = IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT;
break;
}
return errVal;
}
static void
updateGenericTrackingObjectValues(MmsMapping* self, ReportControl* rc, IEC61850_ServiceType serviceType, MmsDataAccessError errVal)
{
ServiceTrkInstance trkInst = NULL;
if (rc->buffered) {
if (self->brcbTrk) {
trkInst = (ServiceTrkInstance) self->brcbTrk;
}
}
else {
if (self->urcbTrk) {
trkInst = (ServiceTrkInstance) self->urcbTrk;
}
}
if (trkInst) {
if (trkInst->serviceType)
MmsValue_setInt32(trkInst->serviceType->mmsValue, (int) serviceType);
if (trkInst->t)
MmsValue_setUtcTimeMs(trkInst->t->mmsValue, Hal_getTimeInMs());
if (trkInst->errorCode)
MmsValue_setInt32(trkInst->errorCode->mmsValue, convertMmsDataAccessErrorToServiceError(errVal));
char objRef[129];
/* create object reference */
LogicalNode* ln = (LogicalNode*) rc->parentLN;
LogicalDevice* ld = (LogicalDevice*) ln->parent;
char* iedName = self->iedServer->mmsDevice->deviceName;
snprintf(objRef, 129, "%s%s/%s", iedName, ld->name, rc->name);
if (trkInst->objRef) {
IedServer_updateVisibleStringAttributeValue(self->iedServer, trkInst->objRef, objRef);
}
}
}
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
static inline void
clearInclusionFlags(ReportControl* reportControl)
{
@ -1233,8 +1484,10 @@ increaseConfRev(ReportControl* self)
MmsValue_setUint32(self->confRev, confRev);
}
static void
checkReservationTimeout(ReportControl* rc)
checkReservationTimeout(MmsMapping* self, ReportControl* rc)
{
if (rc->enabled == false) {
if (rc->resvTms > 0) {
@ -1250,17 +1503,22 @@ checkReservationTimeout(ReportControl* rc)
rc->reservationTimeout = 0;
updateOwner(rc, NULL);
rc->reserved = false;
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
copyRCBValuesToTrackingObject(self, rc);
updateGenericTrackingObjectValues(self, rc, IEC61850_SERVICE_TYPE_INTERNAL_CHANGE, DATA_ACCESS_ERROR_SUCCESS);
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
}
}
}
}
void
ReportControl_readAccess(ReportControl* rc, char* elementName)
ReportControl_readAccess(ReportControl* rc, MmsMapping* mmsMapping, char* elementName)
{
/* check reservation timeout */
if (rc->buffered) {
checkReservationTimeout(rc);
checkReservationTimeout(mmsMapping, rc);
}
}
@ -1323,7 +1581,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme
/* check reservation timeout for buffered RCBs */
if (rc->buffered) {
checkReservationTimeout(rc);
checkReservationTimeout(self, rc);
if (rc->resvTms == 0) {
/* nothing to to */
@ -1690,8 +1948,21 @@ exit_function:
}
}
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
copyRCBValuesToTrackingObject(self, rc);
updateSingleTrackingValue(self, rc, elementName, value);
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
ReportControl_unlockNotify(rc);
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
updateGenericTrackingObjectValues(self, rc, IEC61850_SERVICE_TYPE_SET_BRCB_VALUES, retVal);
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
return retVal;
}
@ -1731,6 +2002,11 @@ Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection c
rc->reservationTimeout = Hal_getTimeInMs() + (rc->resvTms * 1000);
}
}
#if (CONFIG_IEC61850_SERVICE_TRACKING == 1)
copyRCBValuesToTrackingObject(self, rc);
updateGenericTrackingObjectValues(self, rc, IEC61850_SERVICE_TYPE_INTERNAL_CHANGE, DATA_ACCESS_ERROR_SUCCESS);
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
}
}
}

Loading…
Cancel
Save