- merged latest changes to the server reporting module from 1.3 branch

- merged with 1.3 branch
pull/179/head
Michael Zillgith 7 years ago
parent 0421ea2101
commit 0dff4286aa

@ -147,7 +147,10 @@
#define CONFIG_IEC61850_REPORT_SERVICE 1 #define CONFIG_IEC61850_REPORT_SERVICE 1
/* support buffered report control blocks with ResvTms field */ /* support buffered report control blocks with ResvTms field */
#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0 #define CONFIG_IEC61850_BRCB_WITH_RESVTMS 1
/* allow only configured clients (when pre-configured by ClientLN) - note behavior in PIXIT Rp13 */
#define CONFIG_IEC61850_RCB_ALLOW_ONLY_PRECONFIGURED_CLIENT 0
/* The default buffer size of buffered RCBs in bytes */ /* The default buffer size of buffered RCBs in bytes */
#define CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE 65536 #define CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE 65536

@ -137,7 +137,10 @@
#cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE #cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE
/* support buffered report control blocks with ResvTms field */ /* support buffered report control blocks with ResvTms field */
#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0 #define CONFIG_IEC61850_BRCB_WITH_RESVTMS 1
/* allow only configured clients (when pre-configured by ClientLN) - note behavior in PIXIT Rp13 */
#define CONFIG_IEC61850_RCB_ALLOW_ONLY_PRECONFIGURED_CLIENT 0
/* The default buffer size of buffered RCBs in bytes */ /* The default buffer size of buffered RCBs in bytes */
#cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@ #cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@

@ -104,7 +104,7 @@ int main(int argc, char** argv) {
char* hostname = StringUtils_copyString("localhost"); char* hostname = StringUtils_copyString("localhost");
int tcpPort = 102; int tcpPort = 102;
int maxPduSize = 65000; int maxPduSize = 65000;
int arrayIndex = -1; int arrayIndex = -1;
char* domainName = NULL; char* domainName = NULL;
char* variableName = NULL; char* variableName = NULL;

@ -99,7 +99,7 @@ main(int argc, char** argv)
/* disable MMS file service */ /* disable MMS file service */
IedServerConfig_enableFileService(config, false); IedServerConfig_enableFileService(config, false);
/* disable dynamic data set service */ /* enable dynamic data set service */
IedServerConfig_enableDynamicDataSetService(config, true); IedServerConfig_enableDynamicDataSetService(config, true);
/* disable log service */ /* disable log service */

@ -5,7 +5,6 @@
<Communication> <Communication>
<SubNetwork name="subnetwork1" type="8-MMS"> <SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text> <Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="simpleIO" apName="accessPoint1"> <ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address> <Address>
<P type="IP">0.0.0.0</P> <P type="IP">0.0.0.0</P>
@ -19,6 +18,19 @@
<P type="MMS-Port">102</P> <P type="MMS-Port">102</P>
</Address> </Address>
</ConnectedAP> </ConnectedAP>
<ConnectedAP iedName="remoteClient" apName="accessPoint1">
<Address>
<P type="IP">192.168.2.9</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> </SubNetwork>
</Communication> </Communication>
<IED name="simpleIO"> <IED name="simpleIO">
@ -31,6 +43,7 @@
<ReadWrite /> <ReadWrite />
<GetCBValues /> <GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" /> <ConfLNs fixPrefix="true" fixLnInst="true" />
<ReportSettings cbName="Conf" datSet="Dyn" rptID="Dyn" optFields="Dyn" bufTime="Dyn" trgOps="Dyn" intgPd="Dyn" />
<GOOSE max="5" /> <GOOSE max="5" />
<GSSE max="5" /> <GSSE max="5" />
<FileHandling /> <FileHandling />
@ -68,19 +81,35 @@
<FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" /> <FCDA ldInst="GenericIO" lnClass="GGIO" fc="MX" lnInst="1" doName="AnIn4" daName="q" />
</DataSet> </DataSet>
<ReportControl name="EventsRCB" confRev="4294967295" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50"> <ReportControl name="EventsRCB" confRev="1" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" /> <TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" /> <RptEnabled max="1" />
</ReportControl> </ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50"> <ReportControl name="EventsRCBPreConf" confRev="1" datSet="Events" rptID="Events1" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" /> <TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="3" /> <RptEnabled max="1">
<ClientLN iedName="remoteClient" ldInst="LD0" lnClass="IHMI" lnInst="1"/>
</RptEnabled>
</ReportControl> </ReportControl>
<ReportControl name="Events2" indexed="true" confRev="1" datSet="Events2" rptID="Events2" buffered="false" intgPd="1000" bufTime="50"> <ReportControl name="EventsBRCB" confRev="1" datSet="Events" rptID="Events2" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1" />
</ReportControl>
<ReportControl name="EventsBRCBPreConf" confRev="1" datSet="Events" rptID="Events2" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="1">
<ClientLN iedName="remoteClient" apRef="accessPoint1" ldInst="LD0" lnClass="IHMI" lnInst="1"/>
</RptEnabled>
</ReportControl>
<ReportControl name="EventsIndexed" indexed="true" confRev="1" datSet="Events" rptID="Events2" buffered="false" intgPd="1000" bufTime="50">
<TrgOps period="true" /> <TrgOps period="true" />
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="3" /> <RptEnabled max="3" />
@ -198,10 +227,10 @@
<DO name="AnIn2" type="MV_1_AnIn1" /> <DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" /> <DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" /> <DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1" /> <DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_1" /> <DO name="SPCSO2" type="SPC_2" />
<DO name="SPCSO3" type="SPC_1" /> <DO name="SPCSO3" type="SPC_2" />
<DO name="SPCSO4" type="SPC_1" /> <DO name="SPCSO4" type="SPC_2" />
<DO name="Ind1" type="SPS_1_Proxy" /> <DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" /> <DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" /> <DO name="Ind3" type="SPS_1_Proxy" />
@ -257,7 +286,7 @@
<DA name="t" bType="Timestamp" fc="MX" /> <DA name="t" bType="Timestamp" fc="MX" />
</DOType> </DOType>
<DOType id="SPC_1" cdc="SPC"> <DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct" /> <DA name="origin" fc="ST" type="Originator_1" bType="Struct" />
<DA name="ctlNum" fc="ST" bType="INT8U" /> <DA name="ctlNum" fc="ST" bType="INT8U" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" /> <DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
@ -266,6 +295,14 @@
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" /> <DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" /> <DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
</DOType> </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"> <DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" /> <BDA name="f" bType="FLOAT32" />

@ -2,25 +2,7 @@
<SCL xmlns="http://www.iec.ch/61850/2003/SCL"> <SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" nameStructure="IEDName"> <Header id="" nameStructure="IEDName">
</Header> </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="TEMPLATE"> <IED name="TEMPLATE">
<Services> <Services>
<DynAssociation /> <DynAssociation />
@ -79,12 +61,6 @@
<OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" /> <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" configRef="true" />
<RptEnabled max="3" /> <RptEnabled max="3" />
</ReportControl> </ReportControl>
<ReportControl name="Events2" indexed="true" confRev="1" datSet="Events2" 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"> <ReportControl name="Measurements" indexed="true" confRev="1" datSet="Measurements" rptID="Measurements" buffered="true" intgPd="1000" bufTime="50">
<TrgOps period="false" /> <TrgOps period="false" />
@ -198,10 +174,10 @@
<DO name="AnIn2" type="MV_1_AnIn1" /> <DO name="AnIn2" type="MV_1_AnIn1" />
<DO name="AnIn3" type="MV_1_AnIn1" /> <DO name="AnIn3" type="MV_1_AnIn1" />
<DO name="AnIn4" type="MV_1_AnIn1" /> <DO name="AnIn4" type="MV_1_AnIn1" />
<DO name="SPCSO1" type="SPC_1" /> <DO name="SPCSO1" type="SPC_1_SPCSO1" />
<DO name="SPCSO2" type="SPC_1" /> <DO name="SPCSO2" type="SPC_2" />
<DO name="SPCSO3" type="SPC_1" /> <DO name="SPCSO3" type="SPC_2" />
<DO name="SPCSO4" type="SPC_1" /> <DO name="SPCSO4" type="SPC_2" />
<DO name="Ind1" type="SPS_1_Proxy" /> <DO name="Ind1" type="SPS_1_Proxy" />
<DO name="Ind2" type="SPS_1_Proxy" /> <DO name="Ind2" type="SPS_1_Proxy" />
<DO name="Ind3" type="SPS_1_Proxy" /> <DO name="Ind3" type="SPS_1_Proxy" />
@ -257,7 +233,7 @@
<DA name="t" bType="Timestamp" fc="MX" /> <DA name="t" bType="Timestamp" fc="MX" />
</DOType> </DOType>
<DOType id="SPC_1" cdc="SPC"> <DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct" /> <DA name="origin" fc="ST" type="Originator_1" bType="Struct" />
<DA name="ctlNum" fc="ST" bType="INT8U" /> <DA name="ctlNum" fc="ST" bType="INT8U" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" /> <DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
@ -266,6 +242,14 @@
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" /> <DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" /> <DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
</DOType> </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"> <DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" /> <BDA name="f" bType="FLOAT32" />

@ -1280,62 +1280,10 @@ DataObject iedModel_GenericIO_GGIO1_SPCSO2 = {
"SPCSO2", "SPCSO2",
(ModelNode*) &iedModel_GenericIO_GGIO1, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_origin, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal,
0 0
}; };
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin = {
DataAttributeModelType,
"origin",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlNum,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_origin_orCat,
0,
IEC61850_FC_ST,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin_orCat = {
DataAttributeModelType,
"orCat",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_origin,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_origin_orIdent,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin_orIdent = {
DataAttributeModelType,
"orIdent",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_origin,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_OCTET_STRING_64,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlNum = {
DataAttributeModelType,
"ctlNum",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal,
NULL,
0,
IEC61850_FC_ST,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = {
DataAttributeModelType, DataAttributeModelType,
"stVal", "stVal",
@ -1353,7 +1301,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
@ -1362,37 +1310,11 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = {
DataAttributeModelType, DataAttributeModelType,
"Oper", "Oper",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
NULL, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal,
0, 0,
IEC61850_FC_CO, IEC61850_FC_CO,
@ -1505,66 +1427,40 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = {
NULL, NULL,
0}; 0};
DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = {
DataObjectModelType,
"SPCSO3",
(ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_origin,
0
};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin = {
DataAttributeModelType,
"origin",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlNum,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_origin_orCat,
0,
IEC61850_FC_ST,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin_orCat = {
DataAttributeModelType, DataAttributeModelType,
"orCat", "ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_origin, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_origin_orIdent, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_CF,
IEC61850_ENUMERATED, IEC61850_ENUMERATED,
0, 0,
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin_orIdent = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = {
DataAttributeModelType, DataAttributeModelType,
"orIdent", "t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_origin, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
NULL, NULL,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_OCTET_STRING_64, IEC61850_TIMESTAMP,
0, 0,
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlNum = { DataObject iedModel_GenericIO_GGIO1_SPCSO3 = {
DataAttributeModelType, DataObjectModelType,
"ctlNum", "SPCSO3",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal,
NULL, 0
0, };
IEC61850_FC_ST,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = {
DataAttributeModelType, DataAttributeModelType,
@ -1583,7 +1479,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
@ -1592,37 +1488,11 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = {
DataAttributeModelType, DataAttributeModelType,
"Oper", "Oper",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
NULL, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal,
0, 0,
IEC61850_FC_CO, IEC61850_FC_CO,
@ -1735,66 +1605,40 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = {
NULL, NULL,
0}; 0};
DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = {
DataObjectModelType,
"SPCSO4",
(ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_Ind1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin,
0
};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin = {
DataAttributeModelType,
"origin",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlNum,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat,
0,
IEC61850_FC_ST,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat = {
DataAttributeModelType, DataAttributeModelType,
"orCat", "ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_CF,
IEC61850_ENUMERATED, IEC61850_ENUMERATED,
0, 0,
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = {
DataAttributeModelType, DataAttributeModelType,
"orIdent", "t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3,
NULL, NULL,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_OCTET_STRING_64, IEC61850_TIMESTAMP,
0, 0,
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlNum = { DataObject iedModel_GenericIO_GGIO1_SPCSO4 = {
DataAttributeModelType, DataObjectModelType,
"ctlNum", "SPCSO4",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_Ind1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal,
NULL, 0
0, };
IEC61850_FC_ST,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = {
DataAttributeModelType, DataAttributeModelType,
@ -1813,7 +1657,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
@ -1822,37 +1666,11 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = {
DataAttributeModelType, DataAttributeModelType,
"Oper", "Oper",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
NULL, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal,
0, 0,
IEC61850_FC_CO, IEC61850_FC_CO,
@ -1965,6 +1783,32 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_GGIO1_Ind1 = { DataObject iedModel_GenericIO_GGIO1_Ind1 = {
DataObjectModelType, DataObjectModelType,
"Ind1", "Ind1",
@ -2168,16 +2012,16 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report7;
extern ReportControlBlock iedModel_GenericIO_LLN0_report8; extern ReportControlBlock iedModel_GenericIO_LLN0_report8;
extern ReportControlBlock iedModel_GenericIO_LLN0_report9; extern ReportControlBlock iedModel_GenericIO_LLN0_report9;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report1}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCBPreConf01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report2};
ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report3}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsBRCB01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report3};
ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report4}; ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsBRCBPreConf01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report4};
ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Events201", "Events2", false, "Events2", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report5}; ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report5};
ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Events202", "Events2", false, "Events2", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report6}; ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report6};
ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Events203", "Events2", false, "Events2", 1, 24, 175, 50, 1000, &iedModel_GenericIO_LLN0_report7}; ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report7};
ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report8}; ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report8};
ReportControlBlock iedModel_GenericIO_LLN0_report8 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report9}; ReportControlBlock iedModel_GenericIO_LLN0_report8 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report9};
ReportControlBlock iedModel_GenericIO_LLN0_report9 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report9 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -100,14 +100,8 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin;
@ -117,15 +111,11 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; 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 DataObject iedModel_GenericIO_GGIO1_SPCSO3;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin;
@ -135,15 +125,11 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; 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 DataObject iedModel_GenericIO_GGIO1_SPCSO4;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
@ -153,6 +139,8 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; 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 DataObject iedModel_GenericIO_GGIO1_Ind1;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
@ -261,14 +249,8 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) #define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) #define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) #define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_origin (&iedModel_GenericIO_GGIO1_SPCSO2_origin)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_origin_orCat)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_origin_orIdent)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_ctlNum)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) #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_q (&iedModel_GenericIO_GGIO1_SPCSO2_q)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) #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_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 (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin)
@ -278,15 +260,11 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) #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_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_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 (&iedModel_GenericIO_GGIO1_SPCSO3)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_origin (&iedModel_GenericIO_GGIO1_SPCSO3_origin)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_origin_orCat)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_origin_orIdent)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_ctlNum)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) #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_q (&iedModel_GenericIO_GGIO1_SPCSO3_q)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) #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_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 (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin)
@ -296,15 +274,11 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) #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_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_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 (&iedModel_GenericIO_GGIO1_SPCSO4)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin (&iedModel_GenericIO_GGIO1_SPCSO4_origin)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_ctlNum)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) #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_q (&iedModel_GenericIO_GGIO1_SPCSO4_q)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) #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_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 (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin)
@ -314,6 +288,8 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) #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_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_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 (&iedModel_GenericIO_GGIO1_Ind1)
#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) #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_q (&iedModel_GenericIO_GGIO1_Ind1_q)

@ -1,15 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--This file is generated using Kalkitech SCL Manager IEC61850 Configuration Tool (www.kalkitech.com)-->
<SCL xmlns="http://www.iec.ch/61850/2003/SCL"> <SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" version="4.0.2" revision="" toolID="" nameStructure="IEDName"> <Header id="" version="1.0.0" revision="" toolID="" nameStructure="IEDName">
</Header> </Header>
<Communication> <Communication>
<SubNetwork name="subnetwork1" type="8-MMS"> <SubNetwork name="subnetwork1" type="8-MMS">
<Text>Station bus</Text> <Text>Station bus</Text>
<BitRate unit="b/s">10</BitRate>
<ConnectedAP iedName="simpleIO" apName="accessPoint1"> <ConnectedAP iedName="simpleIO" apName="accessPoint1">
<Address> <Address>
<P type="IP">10.0.0.2</P> <P type="IP">192.168.2.223</P>
<P type="IP-SUBNET">255.255.255.0</P> <P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">10.0.0.1</P> <P type="IP-GATEWAY">10.0.0.1</P>
<P type="OSI-TSEL">0001</P> <P type="OSI-TSEL">0001</P>
@ -29,10 +27,7 @@
<ReadWrite /> <ReadWrite />
<GetCBValues /> <GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" /> <ConfLNs fixPrefix="true" fixLnInst="true" />
<GOOSE max="5" />
<GSSE max="5" />
<FileHandling /> <FileHandling />
<GSEDir />
<TimerActivatedControl /> <TimerActivatedControl />
</Services> </Services>
<AccessPoint name="accessPoint1"> <AccessPoint name="accessPoint1">

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

@ -1882,8 +1882,8 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = {
extern ReportControlBlock iedModel_GenericIO_LLN0_report0; extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
extern ReportControlBlock iedModel_GenericIO_LLN0_report1; extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "AnalogValuesRCB01", "AnalogValues", false, "AnalogValues", 1, 24, 111, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "AnalogValuesRCB01", "AnalogValues", false, "AnalogValues", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};
extern GSEControlBlock iedModel_GenericIO_LLN0_gse0; extern GSEControlBlock iedModel_GenericIO_LLN0_gse0;

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

@ -1795,7 +1795,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = {
extern ReportControlBlock iedModel_GenericIO_LLN0_report0; extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 239, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -3,7 +3,7 @@
* *
* automatically generated from sampleModel_with_dataset.icd * automatically generated from sampleModel_with_dataset.icd
*/ */
#include "../server_example_simple/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();
@ -1590,7 +1590,7 @@ DataAttribute iedModel_Device1_MMXU2_TotW_t = {
extern ReportControlBlock iedModel_Device1_LLN0_report0; extern ReportControlBlock iedModel_Device1_LLN0_report0;
ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 25, 239, 50, 900000, NULL}; ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 25, 239, 50, 900000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -970,8 +970,8 @@ DataAttribute iedModel_LD1_GGIO1_AnIn1_subID = {
extern ReportControlBlock iedModel_LD1_LLN0_report0; extern ReportControlBlock iedModel_LD1_LLN0_report0;
extern ReportControlBlock iedModel_LD1_LLN0_report1; extern ReportControlBlock iedModel_LD1_LLN0_report1;
ReportControlBlock iedModel_LD1_LLN0_report0 = {&iedModel_LD1_LLN0, "urcb01", "13e08c78", false, "", 1, 23, 247, 3000, 5000, &iedModel_LD1_LLN0_report1}; ReportControlBlock iedModel_LD1_LLN0_report0 = {&iedModel_LD1_LLN0, "urcb01", "13e08c78", false, "", 1, 23, 247, 3000, 5000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_LD1_LLN0_report1};
ReportControlBlock iedModel_LD1_LLN0_report1 = {&iedModel_LD1_LLN0, "urcb02", "13e08c78", false, "", 1, 23, 247, 3000, 5000, NULL}; ReportControlBlock iedModel_LD1_LLN0_report1 = {&iedModel_LD1_LLN0, "urcb02", "13e08c78", false, "", 1, 23, 247, 3000, 5000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -1843,10 +1843,10 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
extern ReportControlBlock iedModel_GenericIO_LLN0_report2; extern ReportControlBlock iedModel_GenericIO_LLN0_report2;
extern ReportControlBlock iedModel_GenericIO_LLN0_report3; extern ReportControlBlock iedModel_GenericIO_LLN0_report3;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report1}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report2};
ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 111, 50, 1000, &iedModel_GenericIO_LLN0_report3}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report3};
ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 111, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -3,7 +3,7 @@
* *
* automatically generated from complexModel.icd * automatically generated from complexModel.icd
*/ */
#include "../server_example_write_handler/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();
@ -3580,7 +3580,7 @@ DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = {
extern ReportControlBlock iedModel_Inverter_LLN0_report0; extern ReportControlBlock iedModel_Inverter_LLN0_report0;
ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};

@ -1,9 +1,9 @@
/* /*
* static_model.c * static_model.c
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.cid
*/ */
#include "../server_example_basic_io/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();
@ -248,7 +248,7 @@ DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -309,7 +309,7 @@ DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -357,7 +357,7 @@ DataAttribute iedModel_GenericIO_LLN0_Health_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -509,7 +509,7 @@ DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -601,10 +601,23 @@ DataObject iedModel_GenericIO_GGIO1_Mod = {
"Mod", "Mod",
(ModelNode*) &iedModel_GenericIO_GGIO1, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_Beh, (ModelNode*) &iedModel_GenericIO_GGIO1_Beh,
(ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_stVal,
0 0
}; };
DataAttribute iedModel_GenericIO_GGIO1_Mod_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
(ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { DataAttribute iedModel_GenericIO_GGIO1_Mod_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
@ -661,7 +674,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -709,7 +722,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = {
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
IEC61850_INT32, IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED, 0 + TRG_OPT_DATA_CHANGED,
NULL, NULL,
0}; 0};
@ -1037,10 +1050,62 @@ DataObject iedModel_GenericIO_GGIO1_SPCSO1 = {
"SPCSO1", "SPCSO1",
(ModelNode*) &iedModel_GenericIO_GGIO1, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_origin,
0 0
}; };
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_origin = {
DataAttributeModelType,
"origin",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlNum,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_origin_orCat,
0,
IEC61850_FC_ST,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_origin_orCat = {
DataAttributeModelType,
"orCat",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_origin,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_origin_orIdent,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_origin_orIdent = {
DataAttributeModelType,
"orIdent",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_origin,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_OCTET_STRING_64,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlNum = {
DataAttributeModelType,
"ctlNum",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal,
NULL,
0,
IEC61850_FC_ST,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = {
DataAttributeModelType, DataAttributeModelType,
"stVal", "stVal",
@ -1058,7 +1123,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
@ -1067,11 +1132,37 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = {
DataAttributeModelType, DataAttributeModelType,
"Oper", "Oper",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, NULL,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal,
0, 0,
IEC61850_FC_CO, IEC61850_FC_CO,
@ -1184,32 +1275,6 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { DataObject iedModel_GenericIO_GGIO1_SPCSO2 = {
DataObjectModelType, DataObjectModelType,
"SPCSO2", "SPCSO2",
@ -1943,27 +2008,25 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report3;
extern ReportControlBlock iedModel_GenericIO_LLN0_report4; extern ReportControlBlock iedModel_GenericIO_LLN0_report4;
extern ReportControlBlock iedModel_GenericIO_LLN0_report5; extern ReportControlBlock iedModel_GenericIO_LLN0_report5;
extern ReportControlBlock iedModel_GenericIO_LLN0_report6; extern ReportControlBlock iedModel_GenericIO_LLN0_report6;
extern ReportControlBlock iedModel_GenericIO_LLN0_report7;
extern ReportControlBlock iedModel_GenericIO_LLN0_report8;
extern ReportControlBlock iedModel_GenericIO_LLN0_report9;
ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report1}; ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1};
ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report2}; ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCBPreConf01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report2};
ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report3}; ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsBRCB01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report3};
ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report4}; ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsBRCBPreConf01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report4};
ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5}; ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report5};
ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6}; ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report6};
ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report7};
ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report8};
ReportControlBlock iedModel_GenericIO_LLN0_report8 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report9};
ReportControlBlock iedModel_GenericIO_LLN0_report9 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL};
extern LogControlBlock iedModel_GenericIO_LLN0_lcb0;
extern LogControlBlock iedModel_GenericIO_LLN0_lcb1;
LogControlBlock iedModel_GenericIO_LLN0_lcb0 = {&iedModel_GenericIO_LLN0, "EventLog", "Events", "GenericIO/LLN0$EventLog", 3, 0, true, true, &iedModel_GenericIO_LLN0_lcb1};
LogControlBlock iedModel_GenericIO_LLN0_lcb1 = {&iedModel_GenericIO_LLN0, "GeneralLog", NULL, NULL, 3, 0, true, true, NULL};
extern Log iedModel_GenericIO_LLN0_log0;
extern Log iedModel_GenericIO_LLN0_log1;
Log iedModel_GenericIO_LLN0_log0 = {&iedModel_GenericIO_LLN0, "GeneralLog", &iedModel_GenericIO_LLN0_log1};
Log iedModel_GenericIO_LLN0_log1 = {&iedModel_GenericIO_LLN0, "EventLog", NULL};
IedModel iedModel = { IedModel iedModel = {
@ -1974,8 +2037,8 @@ IedModel iedModel = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
&iedModel_GenericIO_LLN0_lcb0, NULL,
&iedModel_GenericIO_LLN0_log0, NULL,
initializeValues initializeValues
}; };
@ -1983,16 +2046,30 @@ static void
initializeValues() initializeValues()
{ {
iedModel_GenericIO_LLN0_Mod_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
iedModel_GenericIO_LLN0_Beh_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_LLN0_Health_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); iedModel_GenericIO_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation");
iedModel_GenericIO_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("0.7.3"); iedModel_GenericIO_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("1.3.0");
iedModel_GenericIO_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example"); iedModel_GenericIO_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example");
iedModel_GenericIO_LPHD1_PhyHealth_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_GGIO1_Mod_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0);
iedModel_GenericIO_GGIO1_Beh_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_GGIO1_Health_stVal.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1);
iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1);

@ -1,7 +1,7 @@
/* /*
* static_model.h * static_model.h
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.cid
*/ */
#ifndef STATIC_MODEL_H_ #ifndef STATIC_MODEL_H_
@ -45,6 +45,7 @@ extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q;
extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t;
extern LogicalNode iedModel_GenericIO_GGIO1; extern LogicalNode iedModel_GenericIO_GGIO1;
extern DataObject iedModel_GenericIO_GGIO1_Mod; 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_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t;
extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel;
@ -81,8 +82,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f;
extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; 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_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; 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;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin;
@ -92,8 +99,6 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; extern DataObject iedModel_GenericIO_GGIO1_SPCSO2;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q;
@ -189,6 +194,7 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) #define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t)
#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) #define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1)
#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) #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_q (&iedModel_GenericIO_GGIO1_Mod_q)
#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) #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_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel)
@ -225,8 +231,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) #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_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) #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_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) #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 (&iedModel_GenericIO_GGIO1_SPCSO1_Oper)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) #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 (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin)
@ -236,8 +248,6 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) #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_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) #define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) #define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2)
#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) #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_q (&iedModel_GenericIO_GGIO1_SPCSO2_q)

@ -442,8 +442,12 @@ Socket_write(Socket self, uint8_t* buf, int size)
if (self->fd == -1) if (self->fd == -1)
return -1; return -1;
// MSG_NOSIGNAL - prevent send to signal SIGPIPE when peer unexpectedly closed the socket int retVal = send(self->fd, buf, size, 0);
return send(self->fd, buf, size, 0);
if ((retVal == -1) && (errno == EAGAIN))
return 0;
else
return retVal;
} }
void void

@ -532,7 +532,12 @@ Socket_write(Socket self, uint8_t* buf, int size)
return -1; return -1;
/* MSG_NOSIGNAL - prevent send to signal SIGPIPE when peer unexpectedly closed the socket */ /* MSG_NOSIGNAL - prevent send to signal SIGPIPE when peer unexpectedly closed the socket */
return send(self->fd, buf, size, MSG_NOSIGNAL); int retVal = send(self->fd, buf, size, MSG_NOSIGNAL);
if ((retVal == -1) && (errno == EAGAIN))
return 0;
else
return retVal;
} }
void void

@ -39,9 +39,9 @@ struct sThread {
Semaphore Semaphore
Semaphore_create(int initialValue) Semaphore_create(int initialValue)
{ {
char tmpname[] = {"/tmp/libiec61850.XXXXXX"}; Semaphore self = GLOBAL_MALLOC(sizeof(sem_t));
mktemp(tmpname);
Semaphore self = sem_open(tmpname, O_CREAT, 0666, initialValue); sem_init((sem_t*) self, 0, initialValue);
return self; return self;
} }

@ -122,7 +122,7 @@ StringUtils_sortList(LinkedList list);
* *
* \return true when parsing has been successful, false otherwise * \return true when parsing has been successful, false otherwise
*/ */
bool LIB61850_INTERNAL bool
StringUtils_convertIPv6AdddressStringToByteArray(const char* addressString, uint8_t ipV6Addr[]); StringUtils_convertIPv6AdddressStringToByteArray(const char* addressString, uint8_t ipV6Addr[]);
#ifdef __cplusplus #ifdef __cplusplus

@ -48,7 +48,7 @@
struct sGooseReceiver struct sGooseReceiver
{ {
bool running; bool running;
bool stopped; bool stop;
char* interfaceId; char* interfaceId;
uint8_t* buffer; uint8_t* buffer;
EthernetSocket ethSocket; EthernetSocket ethSocket;
@ -65,6 +65,7 @@ GooseReceiver_create()
if (self != NULL) { if (self != NULL) {
self->running = false; self->running = false;
self->stop = false;
self->interfaceId = NULL; self->interfaceId = NULL;
self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH);
self->ethSocket = NULL; self->ethSocket = NULL;
@ -772,9 +773,6 @@ gooseReceiverLoop(void* threadParameter)
{ {
GooseReceiver self = (GooseReceiver) threadParameter; GooseReceiver self = (GooseReceiver) threadParameter;
self->running = true;
self->stopped = false;
GooseReceiver_startThreadless(self); GooseReceiver_startThreadless(self);
if (self->running) { if (self->running) {
@ -783,12 +781,13 @@ gooseReceiverLoop(void* threadParameter)
if (GooseReceiver_tick(self) == false) if (GooseReceiver_tick(self) == false)
Thread_sleep(1); Thread_sleep(1);
if (self->stop)
break;
} }
GooseReceiver_stopThreadless(self); GooseReceiver_stopThreadless(self);
} }
self->stopped = true;
} }
#endif #endif
@ -822,12 +821,11 @@ void
GooseReceiver_stop(GooseReceiver self) GooseReceiver_stop(GooseReceiver self)
{ {
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
self->stop = true;
self->running = false; self->running = false;
Thread_destroy(self->thread); Thread_destroy(self->thread);
self->stop = false;
while (self->stopped == false)
Thread_sleep(1);
#endif #endif
} }

@ -160,6 +160,18 @@ LIB61850_API ReportControlBlock*
ReportControlBlock_create(const char* name, LogicalNode* parent, char* rptId, bool isBuffered, char* ReportControlBlock_create(const char* name, LogicalNode* parent, char* rptId, bool isBuffered, char*
dataSetName, uint32_t confRef, uint8_t trgOps, uint8_t options, uint32_t bufTm, uint32_t intgPd); dataSetName, uint32_t confRef, uint8_t trgOps, uint8_t options, uint32_t bufTm, uint32_t intgPd);
/**
* \brief Set a pre-configured client for the RCB
*
* If set only the pre configured client should use this RCB instance
*
* \param self the RCB instance
* \param clientType the type of the client (0 = no client, 4 = IPv4 client, 6 = IPv6 client)
* \param clientAddress buffer containing the client address (4 byte in case of an IPv4 address, 16 byte in case of an IPv6 address, NULL for no client)
*/
LIB61850_API void
ReportControlBlock_setPreconfiguredClient(ReportControlBlock* self, uint8_t clientType, uint8_t* clientAddress);
/** /**
* \brief create a new log control block (LCB) * \brief create a new log control block (LCB)
* *

@ -264,6 +264,10 @@ struct sReportControlBlock {
uint32_t bufferTime; /* BufTm - time to buffer events until a report is generated */ uint32_t bufferTime; /* BufTm - time to buffer events until a report is generated */
uint32_t intPeriod; /* IntgPd - integrity period */ uint32_t intPeriod; /* IntgPd - integrity period */
/* type (first byte) and address of the pre-configured client
type can be one of (0 - no reservation, 4 - IPv4 client, 6 - IPv6 client) */
uint8_t clientReservation[17];
ReportControlBlock* sibling; /* next control block in list or NULL if this is the last entry */ ReportControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
}; };

@ -1,7 +1,7 @@
/* /*
* reporting.h * reporting.h
* *
* Copyright 2013, 2014 Michael Zillgith * Copyright 2013-2019 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -28,9 +28,9 @@ typedef struct sReportBufferEntry ReportBufferEntry;
struct sReportBufferEntry { struct sReportBufferEntry {
uint8_t entryId[8]; uint8_t entryId[8];
uint8_t flags; /* bit 0 (1 = isIntegrityReport), bit 1 (1 = isGiReport) */
uint64_t timeOfEntry; uint64_t timeOfEntry;
int entryLength; int entryLength:30;
unsigned int flags:2; /* bit 0 (1 = isIntegrityReport), bit 1 (1 = isGiReport) */
ReportBufferEntry* next; ReportBufferEntry* next;
}; };
@ -42,6 +42,8 @@ typedef struct {
ReportBufferEntry* lastEnqueuedReport; ReportBufferEntry* lastEnqueuedReport;
ReportBufferEntry* nextToTransmit; ReportBufferEntry* nextToTransmit;
bool isOverflow; /* true if overflow condition is active */ bool isOverflow; /* true if overflow condition is active */
Semaphore lock; /* protect access to report buffer */
} ReportBuffer; } ReportBuffer;
typedef struct { typedef struct {
@ -53,6 +55,7 @@ typedef struct {
MmsValue* rcbValues; MmsValue* rcbValues;
MmsValue* inclusionField; MmsValue* inclusionField;
MmsValue* confRev; MmsValue* confRev;
DataSet* dataSet; DataSet* dataSet;
bool isDynamicDataSet; bool isDynamicDataSet;
bool enabled; bool enabled;
@ -76,6 +79,12 @@ typedef struct {
int triggerOps; int triggerOps;
/* information for segmented reporting */
bool segmented; /* indicates that a segmented report is in process */
int startIndexForNextSegment; /* start data set index for the next report segment */
MmsValue* subSeqVal; /* sub sequence value for segmented reporting */
uint64_t segmentedReportTimestamp; /* time stamp used for all report segments */
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore createNotificationsMutex; /* { covered by mutex } */ Semaphore createNotificationsMutex; /* { covered by mutex } */
#endif #endif
@ -91,6 +100,7 @@ typedef struct {
bool isBuffering; /* true if buffered RCB is buffering (datSet is set to a valid value) */ bool isBuffering; /* true if buffered RCB is buffering (datSet is set to a valid value) */
bool isResync; /* true if buffered RCB is in resync state */ bool isResync; /* true if buffered RCB is in resync state */
int resvTms; /* -1 for preconfigured client, 0 - not reserved, > 0 reserved by client */
ReportBuffer* reportBuffer; ReportBuffer* reportBuffer;
MmsValue* timeOfEntry; MmsValue* timeOfEntry;
@ -122,6 +132,9 @@ LIB61850_INTERNAL MmsDataAccessError
Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value, Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value,
MmsServerConnection connection); MmsServerConnection connection);
LIB61850_INTERNAL void
ReportControl_readAccess(ReportControl* rc, char* elementName);
LIB61850_INTERNAL void LIB61850_INTERNAL void
Reporting_activateBufferedReports(MmsMapping* self); Reporting_activateBufferedReports(MmsMapping* self);

@ -99,6 +99,7 @@ createControlObjects(IedServer self, MmsDomain* domain, char* lnName, MmsVariabl
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: createControlObjects: Unknown element in CO: %s\n", coElementSpec->name); printf("IED_SERVER: createControlObjects: Unknown element in CO: %s\n", coElementSpec->name);
break;
} }
} }

@ -417,6 +417,9 @@ ControlObject_destroy(ControlObject* self)
if (self->mmsValue != NULL) if (self->mmsValue != NULL)
MmsValue_delete(self->mmsValue); MmsValue_delete(self->mmsValue);
if (self->sbo != NULL)
MmsValue_delete(self->sbo);
if (self->emptyString != NULL) if (self->emptyString != NULL)
MmsValue_delete(self->emptyString); MmsValue_delete(self->emptyString);

File diff suppressed because it is too large Load Diff

@ -360,12 +360,29 @@ ReportControlBlock_create(const char* name, LogicalNode* parent, char* rptId, bo
self->bufferTime = bufTm; self->bufferTime = bufTm;
self->intPeriod = intgPd; self->intPeriod = intgPd;
self->sibling = NULL; self->sibling = NULL;
self->clientReservation[0] = 0; /* no pre-configured client */
LogicalNode_addReportControlBlock(parent, self); LogicalNode_addReportControlBlock(parent, self);
return self; return self;
} }
void
ReportControlBlock_setPreconfiguredClient(ReportControlBlock* self, uint8_t clientType, uint8_t* clientAddress)
{
if (clientType == 4) { /* IPv4 address */
self->clientReservation[0] = 4;
memcpy(self->clientReservation + 1, clientAddress, 4);
}
else if (clientType == 6) { /* IPv6 address */
self->clientReservation[0] = 6;
memcpy(self->clientReservation + 1, clientAddress, 6);
}
else { /* no reservation or unknown type */
self->clientReservation[0] = 0;
}
}
#if (CONFIG_IEC61850_SETTING_GROUPS == 1) #if (CONFIG_IEC61850_SETTING_GROUPS == 1)
static void static void
LogicalNode_addSettingGroupControlBlock(LogicalNode* self, SettingGroupControlBlock* sgcb) LogicalNode_addSettingGroupControlBlock(LogicalNode* self, SettingGroupControlBlock* sgcb)

@ -70,6 +70,13 @@ typedef enum {
MMS_CALL_TYPE_GET_FILE_DIR MMS_CALL_TYPE_GET_FILE_DIR
} eMmsOutstandingCallType; } eMmsOutstandingCallType;
typedef union
{
int32_t i32;
uint32_t u32;
void* ptr;
} MmsClientInternalParameter;
struct sMmsOutstandingCall struct sMmsOutstandingCall
{ {
bool isUsed; bool isUsed;
@ -77,7 +84,7 @@ struct sMmsOutstandingCall
eMmsOutstandingCallType type; eMmsOutstandingCallType type;
void* userCallback; void* userCallback;
void* userParameter; void* userParameter;
void* internalParameter; MmsClientInternalParameter internalParameter;
uint64_t timeout; uint64_t timeout;
}; };

@ -56,7 +56,7 @@ LIB61850_INTERNAL bool
mmsMsg_parseFileOpenResponse(uint8_t* buffer, int bufPos, int maxBufPos, int32_t* frsmId, uint32_t* fileSize, uint64_t* lastModified); mmsMsg_parseFileOpenResponse(uint8_t* buffer, int bufPos, int maxBufPos, int32_t* frsmId, uint32_t* fileSize, uint64_t* lastModified);
LIB61850_INTERNAL bool LIB61850_INTERNAL bool
mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, bool* moreFollows, uint8_t** dataBuffer, int* dataLength); mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t invokeId, int32_t frsmId, bool* moreFollows, MmsConnection_FileReadHandler handler, void* handlerParameter);
LIB61850_INTERNAL void LIB61850_INTERNAL void
mmsMsg_createFileReadResponse(int maxPduSize, uint32_t invokeId, ByteBuffer* response, MmsFileReadStateMachine* frsm); mmsMsg_createFileReadResponse(int maxPduSize, uint32_t invokeId, ByteBuffer* response, MmsFileReadStateMachine* frsm);

@ -48,6 +48,12 @@ MmsServerConnection_init(MmsServerConnection connection, MmsServer server, IsoCo
LIB61850_INTERNAL void LIB61850_INTERNAL void
MmsServerConnection_destroy(MmsServerConnection connection); MmsServerConnection_destroy(MmsServerConnection connection);
LIB61850_INTERNAL int
MmsServerConnection_getMaxMmsPduSize(MmsServerConnection self);
LIB61850_INTERNAL void
MmsServerConnection_sendMessage(MmsServerConnection self, ByteBuffer* message, bool handlerMode);
LIB61850_INTERNAL bool LIB61850_INTERNAL bool
MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList); MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList);

@ -270,7 +270,7 @@ checkForOutstandingCall(MmsConnection self, uint32_t invokeId)
} }
static bool static bool
addToOutstandingCalls(MmsConnection self, uint32_t invokeId, eMmsOutstandingCallType type, void* userCallback, void* userParameter, void* internalParameter) addToOutstandingCalls(MmsConnection self, uint32_t invokeId, eMmsOutstandingCallType type, void* userCallback, void* userParameter, MmsClientInternalParameter internalParameter)
{ {
int i = 0; int i = 0;
@ -333,7 +333,7 @@ sendMessage(MmsConnection self, ByteBuffer* message)
static MmsError static MmsError
sendAsyncRequest(MmsConnection self, uint32_t invokeId, ByteBuffer* message, eMmsOutstandingCallType type, sendAsyncRequest(MmsConnection self, uint32_t invokeId, ByteBuffer* message, eMmsOutstandingCallType type,
void* userCallback, void* userParameter, void* internalParameter) void* userCallback, void* userParameter, MmsClientInternalParameter internalParameter)
{ {
if (addToOutstandingCalls(self, invokeId, type, userCallback, userParameter, internalParameter) == false) { if (addToOutstandingCalls(self, invokeId, type, userCallback, userParameter, internalParameter) == false) {
@ -855,7 +855,7 @@ handleAsyncResponse(MmsConnection self, ByteBuffer* response, uint32_t bufPos, M
handler(outstandingCall->invokeId, outstandingCall->userParameter, err, NULL, false); handler(outstandingCall->invokeId, outstandingCall->userParameter, err, NULL, false);
} }
else { else {
LinkedList nameList = (LinkedList) outstandingCall->internalParameter; LinkedList nameList = (LinkedList) outstandingCall->internalParameter.ptr;
bool moreFollows = mmsClient_parseGetNameListResponse(&nameList, response); bool moreFollows = mmsClient_parseGetNameListResponse(&nameList, response);
@ -880,7 +880,6 @@ handleAsyncResponse(MmsConnection self, ByteBuffer* response, uint32_t bufPos, M
uint32_t fileSize; uint32_t fileSize;
uint64_t lastModified; uint64_t lastModified;
if (mmsMsg_parseFileOpenResponse(ByteBuffer_getBuffer(response), bufPos, ByteBuffer_getSize(response), if (mmsMsg_parseFileOpenResponse(ByteBuffer_getBuffer(response), bufPos, ByteBuffer_getSize(response),
&frsmId, &fileSize, &lastModified) == false) &frsmId, &fileSize, &lastModified) == false)
{ {
@ -900,16 +899,14 @@ handleAsyncResponse(MmsConnection self, ByteBuffer* response, uint32_t bufPos, M
} }
else { else {
bool moreFollows; bool moreFollows;
uint8_t* dataBuffer;
int dataLength;
if (mmsMsg_parseFileReadResponse(ByteBuffer_getBuffer(response), bufPos, ByteBuffer_getSize(response), &moreFollows, &dataBuffer, &dataLength) == false) int32_t frsmId = outstandingCall->internalParameter.i32;
if (mmsMsg_parseFileReadResponse(ByteBuffer_getBuffer(response), bufPos, ByteBuffer_getSize(response), outstandingCall->invokeId, frsmId, &moreFollows,
handler, outstandingCall->userParameter) == false)
{ {
handler(outstandingCall->invokeId, outstandingCall->userParameter, MMS_ERROR_PARSING_RESPONSE, NULL, 0, false); handler(outstandingCall->invokeId, outstandingCall->userParameter, MMS_ERROR_PARSING_RESPONSE, NULL, 0, false);
} }
else {
handler(outstandingCall->invokeId, outstandingCall->userParameter, err, dataBuffer, dataLength, moreFollows);
}
} }
} }
else if ((outstandingCall->type == MMS_CALL_TYPE_FILE_CLOSE) || else if ((outstandingCall->type == MMS_CALL_TYPE_FILE_CLOSE) ||
@ -1860,7 +1857,10 @@ mmsClient_getNameListSingleRequestAsync(
payload, objectClass, continueAfter); payload, objectClass, continueAfter);
} }
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_NAME_LIST, handler, parameter, nameList); MmsClientInternalParameter intParam;
intParam.ptr = nameList;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_NAME_LIST, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2074,7 +2074,10 @@ MmsConnection_readVariableAsync(MmsConnection self, MmsError* mmsError, const ch
mmsClient_createReadRequest(invokeId, domainId, itemId, payload); mmsClient_createReadRequest(invokeId, domainId, itemId, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2135,7 +2138,10 @@ MmsConnection_readVariableComponentAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createReadRequestComponent(invokeId, domainId, itemId, componentId, payload); mmsClient_createReadRequestComponent(invokeId, domainId, itemId, componentId, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2230,7 +2236,10 @@ MmsConnection_readArrayElementsAsync(MmsConnection self, MmsError* mmsError, con
mmsClient_createReadRequestAlternateAccessIndex(invokeId, domainId, itemId, startIndex, mmsClient_createReadRequestAlternateAccessIndex(invokeId, domainId, itemId, startIndex,
numberOfElements, payload); numberOfElements, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2293,7 +2302,10 @@ MmsConnection_readSingleArrayElementWithComponentAsync(MmsConnection self, MmsEr
mmsClient_createReadRequestAlternateAccessSingleIndexComponent(invokeId, domainId, itemId, index, componentId, mmsClient_createReadRequestAlternateAccessSingleIndexComponent(invokeId, domainId, itemId, index, componentId,
payload); payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2354,7 +2366,10 @@ MmsConnection_readMultipleVariablesAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createReadRequestMultipleValues(invokeId, domainId, items, payload); mmsClient_createReadRequestMultipleValues(invokeId, domainId, items, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2417,7 +2432,10 @@ MmsConnection_readNamedVariableListValuesAsync(MmsConnection self, MmsError* mms
mmsClient_createReadNamedVariableListRequest(invokeId, domainId, listName, mmsClient_createReadNamedVariableListRequest(invokeId, domainId, listName,
payload, specWithResult); payload, specWithResult);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2481,7 +2499,10 @@ MmsConnection_readNamedVariableListValuesAssociationSpecificAsync(MmsConnection
mmsClient_createReadAssociationSpecificNamedVariableListRequest(invokeId, listName, mmsClient_createReadAssociationSpecificNamedVariableListRequest(invokeId, listName,
payload, specWithResult); payload, specWithResult);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_MULTIPLE_VARIABLES, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2567,7 +2588,10 @@ MmsConnection_readNamedVariableListDirectoryAsync(MmsConnection self, MmsError*
mmsClient_createGetNamedVariableListAttributesRequest(invokeId, payload, domainId, mmsClient_createGetNamedVariableListAttributesRequest(invokeId, payload, domainId,
listName); listName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_NVL_DIRECTORY, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_NVL_DIRECTORY, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2632,7 +2656,10 @@ MmsConnection_readNamedVariableListDirectoryAssociationSpecificAsync(MmsConnecti
mmsClient_createGetNamedVariableListAttributesRequestAssociationSpecific(invokeId, payload, mmsClient_createGetNamedVariableListAttributesRequestAssociationSpecific(invokeId, payload,
listName); listName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_NVL_DIRECTORY, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_NVL_DIRECTORY, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2707,7 +2734,10 @@ MmsConnection_defineNamedVariableListAsync(MmsConnection self, MmsError* mmsErro
mmsClient_createDefineNamedVariableListRequest(invokeId, payload, domainId, mmsClient_createDefineNamedVariableListRequest(invokeId, payload, domainId,
listName, variableSpecs, false); listName, variableSpecs, false);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DEFINE_NVL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DEFINE_NVL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2762,7 +2792,10 @@ MmsConnection_defineNamedVariableListAssociationSpecificAsync(MmsConnection self
mmsClient_createDefineNamedVariableListRequest(invokeId, payload, NULL, mmsClient_createDefineNamedVariableListRequest(invokeId, payload, NULL,
listName, variableSpecs, true); listName, variableSpecs, true);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DEFINE_NVL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DEFINE_NVL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2819,7 +2852,10 @@ MmsConnection_deleteNamedVariableListAsync(MmsConnection self, MmsError* mmsErro
mmsClient_createDeleteNamedVariableListRequest(invokeId, payload, domainId, listName); mmsClient_createDeleteNamedVariableListRequest(invokeId, payload, domainId, listName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DELETE_NVL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DELETE_NVL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2877,7 +2913,10 @@ MmsConnection_deleteAssociationSpecificNamedVariableListAsync(MmsConnection self
mmsClient_createDeleteAssociationSpecificNamedVariableListRequest( mmsClient_createDeleteAssociationSpecificNamedVariableListRequest(
invokeId, payload, listName); invokeId, payload, listName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DELETE_NVL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_DELETE_NVL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -2954,7 +2993,10 @@ MmsConnection_getVariableAccessAttributesAsync(MmsConnection self, MmsError* mms
mmsClient_createGetVariableAccessAttributesRequest(invokeId, domainId, itemId, payload); mmsClient_createGetVariableAccessAttributesRequest(invokeId, domainId, itemId, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_VAR_ACCESS_ATTR, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_VAR_ACCESS_ATTR, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3036,7 +3078,10 @@ MmsConnection_identifyAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createIdentifyRequest(invokeId, payload); mmsClient_createIdentifyRequest(invokeId, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_IDENTIFY, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_IDENTIFY, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3119,7 +3164,10 @@ MmsConnection_getServerStatusAsync(MmsConnection self, MmsError* mmsError, bool
mmsClient_createStatusRequest(invokeId, payload, extendedDerivation); mmsClient_createStatusRequest(invokeId, payload, extendedDerivation);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_SERVER_STATUS, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_SERVER_STATUS, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3261,7 +3309,10 @@ MmsConnection_readJournalTimeRangeAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createReadJournalRequestWithTimeRange(invokeId, payload, domainId, itemId, startTime, endTime); mmsClient_createReadJournalRequestWithTimeRange(invokeId, payload, domainId, itemId, startTime, endTime);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_JOURNAL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_JOURNAL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3329,7 +3380,10 @@ MmsConnection_readJournalStartAfterAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createReadJournalRequestStartAfter(invokeId, payload, domainId, itemId, timeSpecification, entrySpecification); mmsClient_createReadJournalRequestStartAfter(invokeId, payload, domainId, itemId, timeSpecification, entrySpecification);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_JOURNAL, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_READ_JOURNAL, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3428,7 +3482,10 @@ MmsConnection_fileOpenAsync(MmsConnection self, MmsError* mmsError, const char*
mmsClient_createFileOpenRequest(invokeId, payload, filename, initialPosition); mmsClient_createFileOpenRequest(invokeId, payload, filename, initialPosition);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_OPEN, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_OPEN, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3517,7 +3574,10 @@ MmsConnection_fileCloseAsync(MmsConnection self, MmsError* mmsError, uint32_t fr
mmsClient_createFileCloseRequest(invokeId, payload, frsmId); mmsClient_createFileCloseRequest(invokeId, payload, frsmId);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_CLOSE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_CLOSE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3588,7 +3648,10 @@ MmsConnection_fileDeleteAsync(MmsConnection self, MmsError* mmsError, const char
mmsClient_createFileDeleteRequest(invokeId, payload, fileName); mmsClient_createFileDeleteRequest(invokeId, payload, fileName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_DELETE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_DELETE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3692,7 +3755,10 @@ MmsConnection_fileReadAsync(MmsConnection self, MmsError* mmsError, int32_t frsm
mmsClient_createFileReadRequest(invokeId, payload, frsmId); mmsClient_createFileReadRequest(invokeId, payload, frsmId);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_READ, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.i32 = frsmId;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_READ, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3796,7 +3862,10 @@ MmsConnection_getFileDirectoryAsync(MmsConnection self, MmsError* mmsError, cons
mmsClient_createFileDirectoryRequest(invokeId, payload, fileSpecification, continueAfter); mmsClient_createFileDirectoryRequest(invokeId, payload, fileSpecification, continueAfter);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_FILE_DIR, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_FILE_DIR, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3866,7 +3935,10 @@ MmsConnection_fileRenameAsync(MmsConnection self, MmsError* mmsError, const char
mmsClient_createFileRenameRequest(invokeId, payload, currentFileName, newFileName); mmsClient_createFileRenameRequest(invokeId, payload, currentFileName, newFileName);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_RENAME, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_FILE_RENAME, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -3944,7 +4016,10 @@ MmsConnection_obtainFileAsync(MmsConnection self, MmsError* mmsError, const char
mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile); mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_OBTAIN_FILE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_OBTAIN_FILE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -4022,7 +4097,10 @@ MmsConnection_writeVariableAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createWriteRequest(invokeId, domainId, itemId, value, payload); mmsClient_createWriteRequest(invokeId, domainId, itemId, value, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -4083,7 +4161,10 @@ MmsConnection_writeSingleArrayElementWithComponentAsync(MmsConnection self, MmsE
mmsClient_createWriteRequestAlternateAccessSingleIndexComponent(invokeId, domainId, itemId, arrayIndex, mmsClient_createWriteRequestAlternateAccessSingleIndexComponent(invokeId, domainId, itemId, arrayIndex,
componentId, value, payload); componentId, value, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -4170,7 +4251,10 @@ MmsConnection_writeMultipleVariablesAsync(MmsConnection self, MmsError* mmsError
mmsClient_createWriteMultipleItemsRequest(invokeId, domainId, items, values, payload); mmsClient_createWriteMultipleItemsRequest(invokeId, domainId, items, values, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_MULTIPLE_VARIABLES, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_MULTIPLE_VARIABLES, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -4231,7 +4315,10 @@ MmsConnection_writeArrayElementsAsync(MmsConnection self, MmsError* mmsError,
mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload); mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_VARIABLE, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
@ -4298,7 +4385,10 @@ MmsConnection_writeNamedVariableListAsync(MmsConnection self, MmsError* mmsError
mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload); mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload);
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_MULTIPLE_VARIABLES, handler, parameter, NULL); MmsClientInternalParameter intParam;
intParam.ptr = NULL;
MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_WRITE_MULTIPLE_VARIABLES, handler, parameter, intParam);
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;

@ -689,12 +689,16 @@ mmsMsg_parseFileOpenResponse(uint8_t* buffer, int bufPos, int maxBufPos, int32_t
} }
bool bool
mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, bool* moreFollows, uint8_t** dataBuffer, int* dataLength) mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t invokeId, int frsmId, bool* moreFollows, MmsConnection_FileReadHandler handler, void* handlerParameter)
{ {
int length; int length;
uint8_t* data = NULL;
int dataLen = 0;
uint8_t tag = buffer[bufPos++]; uint8_t tag = buffer[bufPos++];
if (tag != 0xbf) { if (tag != 0xbf) {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT/SERVER: mmsClient_parseFileReadResponse: unknown tag %02x\n", tag); printf("MMS_CLIENT/SERVER: mmsClient_parseFileReadResponse: unknown tag %02x\n", tag);
@ -704,8 +708,6 @@ mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, bool* m
tag = buffer[bufPos++]; tag = buffer[bufPos++];
*moreFollows = true; *moreFollows = true;
*dataBuffer = NULL;
*dataLength = 0;
if (tag != 0x49) { if (tag != 0x49) {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
@ -731,11 +733,11 @@ mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, bool* m
if (bufPos < 0) if (bufPos < 0)
return false; return false;
switch (tag) switch (tag) {
{
case 0x80: /* fileData */ case 0x80: /* fileData */
*dataBuffer = buffer + bufPos; data = buffer + bufPos;
*dataLength = length; dataLen = length;
bufPos += length; bufPos += length;
break; break;
@ -753,8 +755,7 @@ mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, bool* m
} }
} }
if (*dataBuffer == NULL) handler(invokeId, handlerParameter, frsmId, data, dataLen, *moreFollows);
return false;
return true; return true;
} }

@ -244,163 +244,195 @@ mmsMsg_parseDataElement(Data_t* dataElement)
printf("MMS CLIENT: error parsing data element (invalid structure size)!\n"); printf("MMS CLIENT: error parsing data element (invalid structure size)!\n");
} }
} }
else if (dataElement->present == Data_PR_integer) { else if (dataElement->present == Data_PR_array) {
if (dataElement->choice.integer.size > 0) { int componentCount = dataElement->choice.array->list.count;
Asn1PrimitiveValue* berInteger = BerInteger_createFromBuffer(
dataElement->choice.integer.buf, dataElement->choice.integer.size); if (componentCount > 0) {
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value = MmsValue_newIntegerFromBerInteger(berInteger); value->type = MMS_ARRAY;
value->value.structure.size = componentCount;
value->value.structure.components = (MmsValue**) GLOBAL_CALLOC(componentCount, sizeof(MmsValue*));
int i;
for (i = 0; i < componentCount; i++) {
value->value.structure.components[i] =
mmsMsg_parseDataElement(dataElement->choice.array->list.array[i]);
if (value->value.structure.components[i] == NULL) {
MmsValue_delete(value);
value = NULL;
break;
}
}
} }
else { else {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (invalid integer size)!\n"); printf("MMS CLIENT: error parsing data element (invalid array size)!\n");
} }
} }
else if (dataElement->present == Data_PR_unsigned) { else {
if (dataElement->present == Data_PR_integer) {
if (dataElement->choice.Unsigned.size > 0) { if (dataElement->choice.integer.size > 0) {
Asn1PrimitiveValue* berInteger = BerInteger_createFromBuffer( Asn1PrimitiveValue* berInteger = BerInteger_createFromBuffer(
dataElement->choice.Unsigned.buf, dataElement->choice.Unsigned.size); dataElement->choice.integer.buf, dataElement->choice.integer.size);
value = MmsValue_newUnsignedFromBerInteger(berInteger); value = MmsValue_newIntegerFromBerInteger(berInteger);
}
else {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (invalid integer size)!\n");
}
} }
else { else if (dataElement->present == Data_PR_unsigned) {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (invalid unsigned size)!\n"); if (dataElement->choice.Unsigned.size > 0) {
Asn1PrimitiveValue* berInteger = BerInteger_createFromBuffer(
dataElement->choice.Unsigned.buf, dataElement->choice.Unsigned.size);
value = MmsValue_newUnsignedFromBerInteger(berInteger);
}
else {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (invalid unsigned size)!\n");
}
} }
} else if (dataElement->present == Data_PR_visiblestring) {
else if (dataElement->present == Data_PR_visiblestring) {
if (dataElement->choice.visiblestring.size >= 0) { if (dataElement->choice.visiblestring.size >= 0) {
value = MmsValue_newVisibleStringFromByteArray(dataElement->choice.visiblestring.buf, value = MmsValue_newVisibleStringFromByteArray(dataElement->choice.visiblestring.buf,
dataElement->choice.visiblestring.size); dataElement->choice.visiblestring.size);
}
} }
} else if (dataElement->present == Data_PR_mMSString) {
else if (dataElement->present == Data_PR_mMSString) {
if ( dataElement->choice.mMSString.size >= 0) { if ( dataElement->choice.mMSString.size >= 0) {
value = MmsValue_newMmsStringFromByteArray(dataElement->choice.mMSString.buf, value = MmsValue_newMmsStringFromByteArray(dataElement->choice.mMSString.buf,
dataElement->choice.mMSString.size); dataElement->choice.mMSString.size);
}
} }
} else if (dataElement->present == Data_PR_bitstring) {
else if (dataElement->present == Data_PR_bitstring) {
int size = dataElement->choice.bitstring.size; int size = dataElement->choice.bitstring.size;
if (size > 0) { if (size > 0) {
int maxSize = (size * 8); int maxSize = (size * 8);
int bitSize = maxSize - dataElement->choice.bitstring.bits_unused; int bitSize = maxSize - dataElement->choice.bitstring.bits_unused;
if ((bitSize > 0) && (maxSize >= bitSize)) { if ((bitSize > 0) && (maxSize >= bitSize)) {
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_BIT_STRING; value->type = MMS_BIT_STRING;
value->value.bitString.size = bitSize; value->value.bitString.size = bitSize;
value->value.bitString.buf = (uint8_t*) GLOBAL_MALLOC(size); value->value.bitString.buf = (uint8_t*) GLOBAL_MALLOC(size);
memcpy(value->value.bitString.buf, memcpy(value->value.bitString.buf,
dataElement->choice.bitstring.buf, size); dataElement->choice.bitstring.buf, size);
}
else {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (bit string padding problem)!\n");
}
} }
else { else {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (bit string padding problem)!\n"); printf("MMS CLIENT: error parsing data element (bit string size 0 or negative)!\n");
} }
} }
else { else if (dataElement->present == Data_PR_floatingpoint) {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing data element (bit string size 0 or negative)!\n");
}
}
else if (dataElement->present == Data_PR_floatingpoint) {
int size = dataElement->choice.floatingpoint.size; int size = dataElement->choice.floatingpoint.size;
if (size == 5) { /* FLOAT32 */ if (size == 5) { /* FLOAT32 */
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_FLOAT; value->type = MMS_FLOAT;
value->value.floatingPoint.formatWidth = 32; value->value.floatingPoint.formatWidth = 32;
value->value.floatingPoint.exponentWidth = dataElement->choice.floatingpoint.buf[0]; value->value.floatingPoint.exponentWidth = dataElement->choice.floatingpoint.buf[0];
uint8_t* floatBuf = (dataElement->choice.floatingpoint.buf + 1); uint8_t* floatBuf = (dataElement->choice.floatingpoint.buf + 1);
value->value.floatingPoint.buf = (uint8_t*) GLOBAL_MALLOC(4); value->value.floatingPoint.buf = (uint8_t*) GLOBAL_MALLOC(4);
#if (ORDER_LITTLE_ENDIAN == 1) #if (ORDER_LITTLE_ENDIAN == 1)
memcpyReverseByteOrder(value->value.floatingPoint.buf, floatBuf, 4); memcpyReverseByteOrder(value->value.floatingPoint.buf, floatBuf, 4);
#else #else
memcpy(value->value.floatingPoint.buf, floatBuf, 4); memcpy(value->value.floatingPoint.buf, floatBuf, 4);
#endif #endif
} }
if (size == 9) { /* FLOAT64 */ if (size == 9) { /* FLOAT64 */
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_FLOAT; value->type = MMS_FLOAT;
value->value.floatingPoint.formatWidth = 64; value->value.floatingPoint.formatWidth = 64;
value->value.floatingPoint.exponentWidth = dataElement->choice.floatingpoint.buf[0]; value->value.floatingPoint.exponentWidth = dataElement->choice.floatingpoint.buf[0];
uint8_t* floatBuf = (dataElement->choice.floatingpoint.buf + 1); uint8_t* floatBuf = (dataElement->choice.floatingpoint.buf + 1);
value->value.floatingPoint.buf = (uint8_t*) GLOBAL_MALLOC(8); value->value.floatingPoint.buf = (uint8_t*) GLOBAL_MALLOC(8);
#if (ORDER_LITTLE_ENDIAN == 1) #if (ORDER_LITTLE_ENDIAN == 1)
memcpyReverseByteOrder(value->value.floatingPoint.buf, floatBuf, 8); memcpyReverseByteOrder(value->value.floatingPoint.buf, floatBuf, 8);
#else #else
memcpy(value->value.floatingPoint.buf, floatBuf, 8); memcpy(value->value.floatingPoint.buf, floatBuf, 8);
#endif #endif
}
} }
} else if (dataElement->present == Data_PR_utctime) {
else if (dataElement->present == Data_PR_utctime) {
int size = dataElement->choice.utctime.size; int size = dataElement->choice.utctime.size;
if (size == 8) { if (size == 8) {
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_UTC_TIME; value->type = MMS_UTC_TIME;
memcpy(value->value.utcTime, dataElement->choice.utctime.buf, 8); memcpy(value->value.utcTime, dataElement->choice.utctime.buf, 8);
} }
else { else {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing UTC time (size is %i instead of 8\n", size); printf("MMS CLIENT: error parsing UTC time (size is %i instead of 8\n", size);
}
} }
} else if (dataElement->present == Data_PR_octetstring) {
else if (dataElement->present == Data_PR_octetstring) {
if (dataElement->choice.octetstring.size >= 0) { if (dataElement->choice.octetstring.size >= 0) {
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_OCTET_STRING; value->type = MMS_OCTET_STRING;
int size = dataElement->choice.octetstring.size; int size = dataElement->choice.octetstring.size;
value->value.octetString.size = size; value->value.octetString.size = size;
value->value.octetString.maxSize = size; value->value.octetString.maxSize = size;
value->value.octetString.buf = (uint8_t*) GLOBAL_MALLOC(size); value->value.octetString.buf = (uint8_t*) GLOBAL_MALLOC(size);
memcpy(value->value.octetString.buf, dataElement->choice.octetstring.buf, size); memcpy(value->value.octetString.buf, dataElement->choice.octetstring.buf, size);
} }
} }
else if (dataElement->present == Data_PR_binarytime) { else if (dataElement->present == Data_PR_binarytime) {
int size = dataElement->choice.binarytime.size; int size = dataElement->choice.binarytime.size;
if ((size == 4) || (size == 6)) { if ((size == 4) || (size == 6)) {
value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue)); value = (MmsValue*) GLOBAL_CALLOC(1, sizeof(MmsValue));
value->type = MMS_BINARY_TIME; value->type = MMS_BINARY_TIME;
value->value.binaryTime.size = size; value->value.binaryTime.size = size;
memcpy(value->value.binaryTime.buf, dataElement->choice.binarytime.buf, size); memcpy(value->value.binaryTime.buf, dataElement->choice.binarytime.buf, size);
}
else {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: error parsing binary time (size must be 4 or 6, is %i\n", size);
}
} }
else { else if (dataElement->present == Data_PR_boolean) {
if (DEBUG_MMS_CLIENT) value = MmsValue_newBoolean(dataElement->choice.boolean);
printf("MMS CLIENT: error parsing binary time (size must be 4 or 6, is %i\n", size);
} }
} else if (dataElement->present == Data_PR_booleanArray) {
else if (dataElement->present == Data_PR_boolean) {
value = MmsValue_newBoolean(dataElement->choice.boolean); }
}
else if (dataElement->present == Data_PR_booleanArray) {
if (DEBUG_MMS_CLIENT)
printf("MMS CLIENT: unsupported type - boolean-array\n");
} }
if (DEBUG_MMS_CLIENT) { if (DEBUG_MMS_CLIENT) {

@ -510,6 +510,9 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
IsoConnection_sendMessage(task->connection->isoConnection, response, false); IsoConnection_sendMessage(task->connection->isoConnection, response, false);
FileSystem_closeFile(task->fileHandle);
deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename);
MmsServer_releaseTransmitBuffer(self); MmsServer_releaseTransmitBuffer(self);
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
@ -529,6 +532,9 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
IsoConnection_sendMessage(task->connection->isoConnection, response, false); IsoConnection_sendMessage(task->connection->isoConnection, response, false);
FileSystem_closeFile(task->fileHandle);
deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename);
MmsServer_releaseTransmitBuffer(self); MmsServer_releaseTransmitBuffer(self);
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)

@ -220,7 +220,6 @@ exit_function:
return; return;
} }
void /* send information report for a named variable list */ void /* send information report for a named variable list */
MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, char* itemId, LinkedList values, MmsServerConnection_sendInformationReportVMDSpecific(MmsServerConnection self, char* itemId, LinkedList values,
bool handlerMode) bool handlerMode)

@ -453,12 +453,12 @@ getUploadTaskByInvokeId(MmsServer mmsServer, uint32_t invokeId)
} }
static void static void
mmsFileReadHandler(void* parameter, int32_t frsmId, uint8_t* buffer, uint32_t bytesReceived) mmsFileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* buffer, uint32_t bytesReceived, bool moreFollows)
{ {
MmsObtainFileTask task = (MmsObtainFileTask) parameter; MmsObtainFileTask task = (MmsObtainFileTask) parameter;
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: FILE %i received %i bytes\n", frsmId, bytesReceived); printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived);
FileSystem_writeFile(task->fileHandle, buffer, bytesReceived); FileSystem_writeFile(task->fileHandle, buffer, bytesReceived);
} }
@ -538,12 +538,8 @@ handleConfirmedResponsePdu(
if (fileTask != NULL) { if (fileTask != NULL) {
bool moreFollows; bool moreFollows;
uint8_t* dataBuffer = NULL;
int dataLength = 0;
if (mmsMsg_parseFileReadResponse(buffer, startBufPos, maxBufPos, &moreFollows, &dataBuffer, &dataLength)) { if (mmsMsg_parseFileReadResponse(buffer, startBufPos, maxBufPos, invokeId, fileTask->frmsId, &moreFollows, mmsFileReadHandler, (void*) fileTask)) {
mmsFileReadHandler((void*) fileTask, fileTask->frmsId, dataBuffer, dataLength);
if (moreFollows) { if (moreFollows) {
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_READ; fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_READ;
@ -743,6 +739,18 @@ MmsServerConnection_destroy(MmsServerConnection self)
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }
int
MmsServerConnection_getMaxMmsPduSize(MmsServerConnection self)
{
return self->maxPduSize;
}
void
MmsServerConnection_sendMessage(MmsServerConnection self, ByteBuffer* message, bool handlerMode)
{
IsoConnection_sendMessage(self->isoConnection, message, false);
}
#if (MMS_DYNAMIC_DATA_SETS == 1) #if (MMS_DYNAMIC_DATA_SETS == 1)
bool bool
MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList) MmsServerConnection_addNamedVariableList(MmsServerConnection self, MmsNamedVariableList variableList)

@ -80,7 +80,6 @@ mmsServer_createMmsWriteResponse(MmsServerConnection connection,
response->size = bufPos; response->size = bufPos;
} }
void void
MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeId, MmsDataAccessError indication, bool handlerMode) MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeId, MmsDataAccessError indication, bool handlerMode)
{ {

@ -320,4 +320,32 @@ public class SclParser
return null; return null;
} }
public ConnectedAP getConnectedAP(String iedName, String accessPointName) {
communication = this.getCommunication();
if (communication != null) {
List<SubNetwork> subNetworks = communication.getSubNetworks();
for (SubNetwork subNetwork : subNetworks) {
List<ConnectedAP> connectedAPs = subNetwork.getConnectedAPs();
for (ConnectedAP connectedAP : connectedAPs) {
if (connectedAP.getIedName().equals(iedName)) {
if (connectedAP.getApName().equals(accessPointName)) {
if (withOutput)
System.out.println("Found connectedAP " + accessPointName + " for IED " + iedName);
return connectedAP;
}
}
}
}
}
return null;
}
} }

@ -36,6 +36,8 @@ public class ConnectedAP {
private List<GSE> gses; private List<GSE> gses;
private List<SMV> smvs; private List<SMV> smvs;
private Address address = null;
public ConnectedAP(Node node) throws SclParserException { public ConnectedAP(Node node) throws SclParserException {
iedName = ParserUtils.parseAttribute(node, "iedName"); iedName = ParserUtils.parseAttribute(node, "iedName");
@ -56,7 +58,12 @@ public class ConnectedAP {
List<Node> smvNodes = ParserUtils.getChildNodesWithTag(node, "SMV"); List<Node> smvNodes = ParserUtils.getChildNodesWithTag(node, "SMV");
for (Node smvNode : smvNodes) for (Node smvNode : smvNodes)
smvs.add(new SMV(smvNode)); smvs.add(new SMV(smvNode));
Node addressNode = ParserUtils.getChildNodeWithTag(node, "Address");
if (addressNode != null)
address = new Address(addressNode);
} }
public String getIedName() { public String getIedName() {
@ -66,6 +73,10 @@ public class ConnectedAP {
public String getApName() { public String getApName() {
return apName; return apName;
} }
public Address getAddress() {
return address;
}
public List<GSE> getGses() { public List<GSE> getGses() {
return gses; return gses;

@ -1,5 +1,8 @@
package com.libiec61850.scl.model; package com.libiec61850.scl.model;
import java.util.LinkedList;
import java.util.List;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import com.libiec61850.scl.ParserUtils; import com.libiec61850.scl.ParserUtils;
@ -8,6 +11,8 @@ public class RptEnabled {
private int maxInstances = 1; private int maxInstances = 1;
private String desc = null; private String desc = null;
private List<ClientLN> clientLNs = new LinkedList<ClientLN>();
public RptEnabled(Node rptEnabledNode) { public RptEnabled(Node rptEnabledNode) {
this.desc = ParserUtils.parseAttribute(rptEnabledNode, "desc"); this.desc = ParserUtils.parseAttribute(rptEnabledNode, "desc");
@ -16,6 +21,14 @@ public class RptEnabled {
if (maxString != null) { if (maxString != null) {
maxInstances = new Integer(maxString); maxInstances = new Integer(maxString);
} }
List<Node> clientLNNodes = ParserUtils.getChildNodesWithTag(rptEnabledNode, "ClientLN");
for (Node clientLNNode : clientLNNodes) {
ClientLN clientLN = new ClientLN(clientLNNode);
clientLNs.add(clientLN);
}
} }
public int getMaxInstances() { public int getMaxInstances() {
@ -25,4 +38,9 @@ public class RptEnabled {
public String getDesc() { public String getDesc() {
return desc; return desc;
} }
public List<ClientLN> getClientLNs()
{
return clientLNs;
}
} }

@ -184,6 +184,21 @@ public class ModelViewer {
String lNodePrefix = devPrefix + lNode.getName(); String lNodePrefix = devPrefix + lNode.getName();
printObjectList(lNode.getDataObjects(), output, lNodePrefix); printObjectList(lNode.getDataObjects(), output, lNodePrefix);
// for (DataObject dObject : lNode.getDataObjects()) {
//
// String dOPrefix = lNodePrefix + "." + dObject.getName();
//
// for (DataAttribute dAttribute : dObject.getDataAttributes()) {
//
// String daPrefix = dOPrefix + "." + dAttribute.getName();
//
// output.println(daPrefix + " [" + dAttribute.getFc().toString() + "]");
//
// printSubAttributeList(dAttribute, output, daPrefix);
// }
//
// }
} }
} }

@ -29,17 +29,24 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.libiec61850.scl.SclParser; import com.libiec61850.scl.SclParser;
import com.libiec61850.scl.SclParserException; import com.libiec61850.scl.SclParserException;
import com.libiec61850.scl.communication.Address;
import com.libiec61850.scl.communication.Communication; import com.libiec61850.scl.communication.Communication;
import com.libiec61850.scl.communication.ConnectedAP; import com.libiec61850.scl.communication.ConnectedAP;
import com.libiec61850.scl.communication.GSE; import com.libiec61850.scl.communication.GSE;
import com.libiec61850.scl.communication.P;
import com.libiec61850.scl.communication.PhyComAddress; import com.libiec61850.scl.communication.PhyComAddress;
import com.libiec61850.scl.communication.SubNetwork; import com.libiec61850.scl.communication.SubNetwork;
import com.libiec61850.scl.model.AccessPoint; import com.libiec61850.scl.model.AccessPoint;
import com.libiec61850.scl.model.ClientLN;
import com.libiec61850.scl.model.DataAttribute; import com.libiec61850.scl.model.DataAttribute;
import com.libiec61850.scl.model.DataModelValue; import com.libiec61850.scl.model.DataModelValue;
import com.libiec61850.scl.model.DataObject; import com.libiec61850.scl.model.DataObject;
@ -53,6 +60,7 @@ import com.libiec61850.scl.model.LogControl;
import com.libiec61850.scl.model.LogicalDevice; import com.libiec61850.scl.model.LogicalDevice;
import com.libiec61850.scl.model.LogicalNode; import com.libiec61850.scl.model.LogicalNode;
import com.libiec61850.scl.model.ReportControlBlock; import com.libiec61850.scl.model.ReportControlBlock;
import com.libiec61850.scl.model.RptEnabled;
import com.libiec61850.scl.model.SampledValueControl; import com.libiec61850.scl.model.SampledValueControl;
import com.libiec61850.scl.model.Server; import com.libiec61850.scl.model.Server;
import com.libiec61850.scl.model.SettingControl; import com.libiec61850.scl.model.SettingControl;
@ -103,6 +111,8 @@ public class StaticModelGenerator {
private String hDefineName; private String hDefineName;
private String modelPrefix; private String modelPrefix;
private boolean initializeOnce; private boolean initializeOnce;
private SclParser sclParser;
public StaticModelGenerator(InputStream stream, String icdFile, PrintStream cOut, PrintStream hOut, public StaticModelGenerator(InputStream stream, String icdFile, PrintStream cOut, PrintStream hOut,
String outputFileName, String iedName, String accessPointName, String modelPrefix, String outputFileName, String iedName, String accessPointName, String modelPrefix,
@ -131,7 +141,7 @@ public class StaticModelGenerator {
this.logs = new StringBuffer(); this.logs = new StringBuffer();
this.logVariableNames = new LinkedList<String>(); this.logVariableNames = new LinkedList<String>();
SclParser sclParser = new SclParser(stream); sclParser = new SclParser(stream);
this.outputFileName = outputFileName; this.outputFileName = outputFileName;
this.hDefineName = outputFileName.toUpperCase().replace( '.', '_' ).replace( '-', '_' ) + "_H_"; this.hDefineName = outputFileName.toUpperCase().replace( '.', '_' ).replace( '-', '_' ) + "_H_";
@ -1078,6 +1088,51 @@ public class StaticModelGenerator {
gseControlNumber++; gseControlNumber++;
} }
} }
private String getIpAddressByIedName(SclParser sclParser, String iedName, String apRef)
{
Communication com = sclParser.getCommunication();
if (com != null) {
for (SubNetwork subNetWork : com.getSubNetworks()) {
for (ConnectedAP ap : subNetWork.getConnectedAPs()) {
if (apRef != null) {
boolean isMatching = false;
String apName = ap.getApName();
if (apName != null) {
if (apName.equals(apRef))
isMatching = true;
}
if (isMatching == false)
continue;
}
String apIedName = ap.getIedName();
if (apIedName != null) {
if (apIedName.equals(iedName)) {
Address address = ap.getAddress();
if (address != null) {
P ip = address.getAddressParameter("IP");
if (ip != null)
return ip.getText();
}
}
}
}
}
}
return null;
}
private void printReportControlBlocks(String lnPrefix, LogicalNode logicalNode) { private void printReportControlBlocks(String lnPrefix, LogicalNode logicalNode) {
List<ReportControlBlock> reportControlBlocks = logicalNode.getReportControlBlocks(); List<ReportControlBlock> reportControlBlocks = logicalNode.getReportControlBlocks();
@ -1091,20 +1146,75 @@ public class StaticModelGenerator {
if (rcb.isIndexed()) { if (rcb.isIndexed()) {
int maxInstances = 1; int maxInstances = 1;
List<ClientLN> clientLNs = null;
if (rcb.getRptEna() != null) {
RptEnabled rptEna = rcb.getRptEna();
maxInstances = rptEna.getMaxInstances();
if (rcb.getRptEna() != null) clientLNs = rptEna.getClientLNs();
maxInstances = rcb.getRptEna().getMaxInstances(); }
for (int i = 0; i < maxInstances; i++) { for (int i = 0; i < maxInstances; i++) {
String index = String.format("%02d", (i + 1)); String index = String.format("%02d", (i + 1));
System.out.println("print report instance " + index); System.out.println("print report instance " + index);
byte[] clientAddress = new byte[17];
clientAddress[0] = 0;
if (clientLNs != null) {
try {
ClientLN clientLN = clientLNs.get(i);
if (clientLN != null) {
String iedName = clientLN.getIedName();
String apRef = clientLN.getApRef();
if (iedName != null) {
String ipAddress = getIpAddressByIedName(sclParser, iedName, apRef);
try {
InetAddress inetAddr = InetAddress.getByName(ipAddress);
if (inetAddr instanceof Inet4Address) {
clientAddress[0] = 4;
for (int j = 0; j < 4; j++)
clientAddress[j + 1] = inetAddr.getAddress()[j];
}
else if (inetAddr instanceof Inet6Address) {
clientAddress[0] = 6;
for (int j = 0; j < 16; j++)
clientAddress[j + 1] = inetAddr.getAddress()[j];
}
inetAddr.getAddress();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
catch (IndexOutOfBoundsException ex) {
/* no ClientLN defined for this report instance */
}
}
printReportControlBlockInstance(lnPrefix, rcb, index, reportNumber, reportsCount); printReportControlBlockInstance(lnPrefix, rcb, index, reportNumber, reportsCount, clientAddress);
reportNumber++; reportNumber++;
} }
} else { } else {
printReportControlBlockInstance(lnPrefix, rcb, "", reportNumber, reportsCount); byte[] clientAddress = new byte[17];
clientAddress[0] = 0;
printReportControlBlockInstance(lnPrefix, rcb, "", reportNumber, reportsCount, clientAddress);
reportNumber++; reportNumber++;
} }
} }
@ -1259,7 +1369,7 @@ public class StaticModelGenerator {
this.logControlBlocks.append(lcbString); this.logControlBlocks.append(lcbString);
} }
private void printReportControlBlockInstance(String lnPrefix, ReportControlBlock rcb, String index, int reportNumber, int reportsCount) private void printReportControlBlockInstance(String lnPrefix, ReportControlBlock rcb, String index, int reportNumber, int reportsCount, byte[] clientIpAddr)
{ {
String rcbVariableName = lnPrefix + "_report" + reportNumber; String rcbVariableName = lnPrefix + "_report" + reportNumber;
@ -1326,9 +1436,19 @@ public class StaticModelGenerator {
rcbString += rcb.getIntegrityPeriod().toString() + ", "; rcbString += rcb.getIntegrityPeriod().toString() + ", ";
else else
rcbString += "0, "; rcbString += "0, ";
rcbString += "{";
for (int i = 0; i < 17; i++) {
rcbString += "0x" + Integer.toHexString((int) (clientIpAddr[i] & 0xff));
if (i == 16)
rcbString += "}, ";
else
rcbString += ", ";
}
currentRcbVariableNumber++; currentRcbVariableNumber++;
if (currentRcbVariableNumber < rcbVariableNames.size()) if (currentRcbVariableNumber < rcbVariableNames.size())
rcbString += "&" + rcbVariableNames.get(currentRcbVariableNumber); rcbString += "&" + rcbVariableNames.get(currentRcbVariableNumber);
else else

Loading…
Cancel
Save