diff --git a/examples/server_example_service_tracking/server_example_service_tracking.c b/examples/server_example_service_tracking/server_example_service_tracking.c index 89e2eabe..3d7fd414 100644 --- a/examples/server_example_service_tracking/server_example_service_tracking.c +++ b/examples/server_example_service_tracking/server_example_service_tracking.c @@ -25,6 +25,77 @@ sigint_handler(int signalId) running = 0; } +typedef struct { + float strVal; + int opDlTmms; + int rsDlTmms; + int rstTms; +} PTOC1Settings; + +static PTOC1Settings ptoc1Settings[] = { + {1.0f, 500, 500, 500}, + {2.0f, 1500, 2500, 750}, + {3.0f, 500, 1500, 750}, + {3.5f, 1250, 1750, 500}, + {3.75f, 1250, 1750, 750} +}; + +static void +loadActiveSgValues (int actSG) +{ + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_StrVal_setMag_f, ptoc1Settings[actSG - 1].strVal); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_OpDlTmms_setVal, ptoc1Settings[actSG - 1].opDlTmms); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_RsDlTmms_setVal, ptoc1Settings[actSG - 1].rsDlTmms); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_RstTms_setVal, ptoc1Settings[actSG - 1].rstTms); +} + +static void +loadEditSgValues (int editSG) +{ + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f, ptoc1Settings[editSG - 1].strVal); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal, ptoc1Settings[editSG - 1].opDlTmms); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal, ptoc1Settings[editSG - 1].rsDlTmms); + IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal, ptoc1Settings[editSG - 1].rstTms); +} + +static bool +activeSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb, + uint8_t newActSg, ClientConnection connection) +{ + printf("Switch to setting group %i\n", (int) newActSg); + + loadActiveSgValues(newActSg); + + return true; +} + +static bool +editSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb, + uint8_t newEditSg, ClientConnection connection) +{ + printf("Set edit setting group to %i\n", (int) newEditSg); + + loadEditSgValues(newEditSg); + + return true; +} + +static void +editSgConfirmedHandler(void* parameter, SettingGroupControlBlock* sgcb, + uint8_t editSg) +{ + printf("Received edit sg confirm for sg %i\n", editSg); + + ptoc1Settings[editSg - 1].strVal = MmsValue_toFloat(IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f->mmsValue); + ptoc1Settings[editSg - 1].opDlTmms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal->mmsValue); + ptoc1Settings[editSg - 1].rsDlTmms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal->mmsValue); + ptoc1Settings[editSg - 1].rstTms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal->mmsValue); + + if (IedServer_getActiveSettingGroup(iedServer, sgcb) == editSg) { + loadActiveSgValues(editSg); + } +} + static ControlHandlerResult controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test) { @@ -115,6 +186,14 @@ main(int argc, char** argv) /* configuration object is no longer required */ IedServerConfig_destroy(config); + SettingGroupControlBlock* sgcb = LogicalDevice_getSettingGroupControlBlock(IEDMODEL_GenericIO); + + loadActiveSgValues(sgcb->actSG); + + IedServer_setActiveSettingGroupChangedHandler(iedServer, sgcb, activeSgChangedHandler, NULL); + IedServer_setEditSettingGroupChangedHandler(iedServer, sgcb, editSgChangedHandler, NULL); + IedServer_setEditSettingGroupConfirmationHandler(iedServer, sgcb, editSgConfirmedHandler, NULL); + if (argc > 1) { char* ethernetIfcID = argv[1]; diff --git a/examples/server_example_service_tracking/simpleIO_ltrk_tests.icd b/examples/server_example_service_tracking/simpleIO_ltrk_tests.icd index b1a31058..229ccbba 100644 --- a/examples/server_example_service_tracking/simpleIO_ltrk_tests.icd +++ b/examples/server_example_service_tracking/simpleIO_ltrk_tests.icd @@ -106,6 +106,8 @@ + + on @@ -183,6 +185,7 @@ + @@ -218,6 +221,16 @@ + + + + + + + + + + @@ -227,7 +240,25 @@ + + + + + + + + + + + + + + + + + + @@ -355,6 +386,24 @@ + + + + + + + + + + + + + + + + + + @@ -564,5 +613,11 @@ TimeSynchronisation InternalChange + + unknown + forward + backward + both + diff --git a/examples/server_example_service_tracking/static_model.c b/examples/server_example_service_tracking/static_model.c index 7a548eca..5b735ced 100644 --- a/examples/server_example_service_tracking/static_model.c +++ b/examples/server_example_service_tracking/static_model.c @@ -679,7 +679,7 @@ LogicalNode iedModel_GenericIO_GGIO1 = { LogicalNodeModelType, "GGIO1", (ModelNode*) &iedModel_GenericIO, - (ModelNode*) &iedModel_GenericIO_LTRK1, + (ModelNode*) &iedModel_GenericIO_PTOC1, (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, }; @@ -2088,6 +2088,398 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { NULL, 0}; +LogicalNode iedModel_GenericIO_PTOC1 = { + LogicalNodeModelType, + "PTOC1", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_LTRK1, + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod, +}; + +DataObject iedModel_GenericIO_PTOC1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh, + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_Mod_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod, + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod, + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod, + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_PTOC1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_Str, + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh, + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh, + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_PTOC1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_Str = { + DataObjectModelType, + "Str", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_Op, + (ModelNode*) &iedModel_GenericIO_PTOC1_Str_general, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_Str_general = { + DataAttributeModelType, + "general", + (ModelNode*) &iedModel_GenericIO_PTOC1_Str, + (ModelNode*) &iedModel_GenericIO_PTOC1_Str_dirGeneral, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Str_dirGeneral = { + DataAttributeModelType, + "dirGeneral", + (ModelNode*) &iedModel_GenericIO_PTOC1_Str, + (ModelNode*) &iedModel_GenericIO_PTOC1_Str_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_ENUMERATED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Str_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_PTOC1_Str, + (ModelNode*) &iedModel_GenericIO_PTOC1_Str_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Str_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_PTOC1_Str, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_Op = { + DataObjectModelType, + "Op", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal, + (ModelNode*) &iedModel_GenericIO_PTOC1_Op_general, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_Op_general = { + DataAttributeModelType, + "general", + (ModelNode*) &iedModel_GenericIO_PTOC1_Op, + (ModelNode*) &iedModel_GenericIO_PTOC1_Op_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Op_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_PTOC1_Op, + (ModelNode*) &iedModel_GenericIO_PTOC1_Op_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_Op_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_PTOC1_Op, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_StrVal = { + DataObjectModelType, + "StrVal", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms, + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal, + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag, + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag_f, + 0, + IEC61850_FC_SG, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SG, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_GenericIO_PTOC1_StrVal, + NULL, + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f, + 0, + IEC61850_FC_SE, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SE, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_OpDlTmms = { + DataObjectModelType, + "OpDlTmms", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms, + (ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms_setVal, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_OpDlTmms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms, + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal, + NULL, + 0, + IEC61850_FC_SG, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms, + NULL, + NULL, + 0, + IEC61850_FC_SE, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_RsDlTmms = { + DataObjectModelType, + "RsDlTmms", + (ModelNode*) &iedModel_GenericIO_PTOC1, + (ModelNode*) &iedModel_GenericIO_PTOC1_RstTms, + (ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms_setVal, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_RsDlTmms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms, + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal, + NULL, + 0, + IEC61850_FC_SG, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms, + NULL, + NULL, + 0, + IEC61850_FC_SE, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataObject iedModel_GenericIO_PTOC1_RstTms = { + DataObjectModelType, + "RstTms", + (ModelNode*) &iedModel_GenericIO_PTOC1, + NULL, + (ModelNode*) &iedModel_GenericIO_PTOC1_RstTms_setVal, + 0 +}; + +DataAttribute iedModel_GenericIO_PTOC1_RstTms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_RstTms, + (ModelNode*) &iedModel_SE_GenericIO_PTOC1_RstTms_setVal, + NULL, + 0, + IEC61850_FC_SG, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_SE_GenericIO_PTOC1_RstTms_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_PTOC1_RstTms, + NULL, + NULL, + 0, + IEC61850_FC_SE, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + LogicalNode iedModel_GenericIO_LTRK1 = { LogicalNodeModelType, "LTRK1", @@ -3775,7 +4167,7 @@ DataObject iedModel_GenericIO_LTRK1_GocbTrk = { DataObjectModelType, "GocbTrk", (ModelNode*) &iedModel_GenericIO_LTRK1, - NULL, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, (ModelNode*) &iedModel_GenericIO_LTRK1_GocbTrk_objRef, 0 }; @@ -3988,6 +4380,223 @@ DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress = { NULL, 0}; +DataObject iedModel_GenericIO_LTRK1_SgcbTrk = { + DataObjectModelType, + "SgcbTrk", + (ModelNode*) &iedModel_GenericIO_LTRK1, + NULL, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_objRef, + 0 +}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_objRef = { + DataAttributeModelType, + "objRef", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_serviceType, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_VISIBLE_STRING_129, + 0 + TRG_OPT_DATA_UPDATE, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_serviceType = { + DataAttributeModelType, + "serviceType", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_errorCode, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_errorCode = { + DataAttributeModelType, + "errorCode", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_originatorID, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_originatorID = { + DataAttributeModelType, + "originatorID", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_t, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_d, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_dU, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dU = { + DataAttributeModelType, + "dU", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_UNICODE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs = { + DataAttributeModelType, + "cdcNs", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cdcName, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcName = { + DataAttributeModelType, + "cdcName", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_dataNs, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dataNs = { + DataAttributeModelType, + "dataNs", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG = { + DataAttributeModelType, + "numOfSG", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_actSG, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_actSG = { + DataAttributeModelType, + "actSG", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_editSG, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_editSG = { + DataAttributeModelType, + "editSG", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit = { + DataAttributeModelType, + "cnfEdit", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_lActTm, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_lActTm = { + DataAttributeModelType, + "lActTm", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_resvTms, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_resvTms = { + DataAttributeModelType, + "resvTms", + (ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk, + NULL, + NULL, + 0, + IEC61850_FC_SR, + IEC61850_INT16U, + 0, + NULL, + 0}; + extern ReportControlBlock iedModel_GenericIO_LLN0_report0; extern ReportControlBlock iedModel_GenericIO_LLN0_report1; extern ReportControlBlock iedModel_GenericIO_LLN0_report2; @@ -4022,6 +4631,9 @@ static PhyComAddress iedModel_GenericIO_LLN0_gse0_address = { GSEControlBlock iedModel_GenericIO_LLN0_gse0 = {&iedModel_GenericIO_LLN0, "gcbEvents", "events", "Events", 3, false, &iedModel_GenericIO_LLN0_gse0_address, 1000, 3000, NULL}; +extern SettingGroupControlBlock iedModel_GenericIO_LLN0_sgcb; + +SettingGroupControlBlock iedModel_GenericIO_LLN0_sgcb = {&iedModel_GenericIO_LLN0, 1, 5, 0, false, 0, 0, NULL}; @@ -4033,7 +4645,7 @@ IedModel iedModel = { &iedModel_GenericIO_LLN0_report0, &iedModel_GenericIO_LLN0_gse0, NULL, - NULL, + &iedModel_GenericIO_LLN0_sgcb, NULL, NULL, initializeValues diff --git a/examples/server_example_service_tracking/static_model.h b/examples/server_example_service_tracking/static_model.h index f3f367ef..31868808 100644 --- a/examples/server_example_service_tracking/static_model.h +++ b/examples/server_example_service_tracking/static_model.h @@ -157,6 +157,39 @@ extern DataObject iedModel_GenericIO_GGIO1_Ind4; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; +extern LogicalNode iedModel_GenericIO_PTOC1; +extern DataObject iedModel_GenericIO_PTOC1_Mod; +extern DataAttribute iedModel_GenericIO_PTOC1_Mod_stVal; +extern DataAttribute iedModel_GenericIO_PTOC1_Mod_q; +extern DataAttribute iedModel_GenericIO_PTOC1_Mod_t; +extern DataAttribute iedModel_GenericIO_PTOC1_Mod_ctlModel; +extern DataObject iedModel_GenericIO_PTOC1_Beh; +extern DataAttribute iedModel_GenericIO_PTOC1_Beh_stVal; +extern DataAttribute iedModel_GenericIO_PTOC1_Beh_q; +extern DataAttribute iedModel_GenericIO_PTOC1_Beh_t; +extern DataObject iedModel_GenericIO_PTOC1_Str; +extern DataAttribute iedModel_GenericIO_PTOC1_Str_general; +extern DataAttribute iedModel_GenericIO_PTOC1_Str_dirGeneral; +extern DataAttribute iedModel_GenericIO_PTOC1_Str_q; +extern DataAttribute iedModel_GenericIO_PTOC1_Str_t; +extern DataObject iedModel_GenericIO_PTOC1_Op; +extern DataAttribute iedModel_GenericIO_PTOC1_Op_general; +extern DataAttribute iedModel_GenericIO_PTOC1_Op_q; +extern DataAttribute iedModel_GenericIO_PTOC1_Op_t; +extern DataObject iedModel_GenericIO_PTOC1_StrVal; +extern DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag; +extern DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag_f; +extern DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag; +extern DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f; +extern DataObject iedModel_GenericIO_PTOC1_OpDlTmms; +extern DataAttribute iedModel_GenericIO_PTOC1_OpDlTmms_setVal; +extern DataAttribute iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal; +extern DataObject iedModel_GenericIO_PTOC1_RsDlTmms; +extern DataAttribute iedModel_GenericIO_PTOC1_RsDlTmms_setVal; +extern DataAttribute iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal; +extern DataObject iedModel_GenericIO_PTOC1_RstTms; +extern DataAttribute iedModel_GenericIO_PTOC1_RstTms_setVal; +extern DataAttribute iedModel_SE_GenericIO_PTOC1_RstTms_setVal; extern LogicalNode iedModel_GenericIO_LTRK1; extern DataObject iedModel_GenericIO_LTRK1_Beh; extern DataAttribute iedModel_GenericIO_LTRK1_Beh_stVal; @@ -306,6 +339,23 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_datSet; extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_confRev; extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_ndsCom; extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress; +extern DataObject iedModel_GenericIO_LTRK1_SgcbTrk; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_objRef; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_serviceType; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_errorCode; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_originatorID; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_t; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_d; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dU; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcName; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dataNs; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_actSG; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_editSG; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_lActTm; +extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_resvTms; @@ -455,6 +505,39 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress; #define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) #define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) #define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) +#define IEDMODEL_GenericIO_PTOC1 (&iedModel_GenericIO_PTOC1) +#define IEDMODEL_GenericIO_PTOC1_Mod (&iedModel_GenericIO_PTOC1_Mod) +#define IEDMODEL_GenericIO_PTOC1_Mod_stVal (&iedModel_GenericIO_PTOC1_Mod_stVal) +#define IEDMODEL_GenericIO_PTOC1_Mod_q (&iedModel_GenericIO_PTOC1_Mod_q) +#define IEDMODEL_GenericIO_PTOC1_Mod_t (&iedModel_GenericIO_PTOC1_Mod_t) +#define IEDMODEL_GenericIO_PTOC1_Mod_ctlModel (&iedModel_GenericIO_PTOC1_Mod_ctlModel) +#define IEDMODEL_GenericIO_PTOC1_Beh (&iedModel_GenericIO_PTOC1_Beh) +#define IEDMODEL_GenericIO_PTOC1_Beh_stVal (&iedModel_GenericIO_PTOC1_Beh_stVal) +#define IEDMODEL_GenericIO_PTOC1_Beh_q (&iedModel_GenericIO_PTOC1_Beh_q) +#define IEDMODEL_GenericIO_PTOC1_Beh_t (&iedModel_GenericIO_PTOC1_Beh_t) +#define IEDMODEL_GenericIO_PTOC1_Str (&iedModel_GenericIO_PTOC1_Str) +#define IEDMODEL_GenericIO_PTOC1_Str_general (&iedModel_GenericIO_PTOC1_Str_general) +#define IEDMODEL_GenericIO_PTOC1_Str_dirGeneral (&iedModel_GenericIO_PTOC1_Str_dirGeneral) +#define IEDMODEL_GenericIO_PTOC1_Str_q (&iedModel_GenericIO_PTOC1_Str_q) +#define IEDMODEL_GenericIO_PTOC1_Str_t (&iedModel_GenericIO_PTOC1_Str_t) +#define IEDMODEL_GenericIO_PTOC1_Op (&iedModel_GenericIO_PTOC1_Op) +#define IEDMODEL_GenericIO_PTOC1_Op_general (&iedModel_GenericIO_PTOC1_Op_general) +#define IEDMODEL_GenericIO_PTOC1_Op_q (&iedModel_GenericIO_PTOC1_Op_q) +#define IEDMODEL_GenericIO_PTOC1_Op_t (&iedModel_GenericIO_PTOC1_Op_t) +#define IEDMODEL_GenericIO_PTOC1_StrVal (&iedModel_GenericIO_PTOC1_StrVal) +#define IEDMODEL_GenericIO_PTOC1_StrVal_setMag (&iedModel_GenericIO_PTOC1_StrVal_setMag) +#define IEDMODEL_GenericIO_PTOC1_StrVal_setMag_f (&iedModel_GenericIO_PTOC1_StrVal_setMag_f) +#define IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag (&iedModel_SE_GenericIO_PTOC1_StrVal_setMag) +#define IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f (&iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f) +#define IEDMODEL_GenericIO_PTOC1_OpDlTmms (&iedModel_GenericIO_PTOC1_OpDlTmms) +#define IEDMODEL_GenericIO_PTOC1_OpDlTmms_setVal (&iedModel_GenericIO_PTOC1_OpDlTmms_setVal) +#define IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal (&iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal) +#define IEDMODEL_GenericIO_PTOC1_RsDlTmms (&iedModel_GenericIO_PTOC1_RsDlTmms) +#define IEDMODEL_GenericIO_PTOC1_RsDlTmms_setVal (&iedModel_GenericIO_PTOC1_RsDlTmms_setVal) +#define IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal (&iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal) +#define IEDMODEL_GenericIO_PTOC1_RstTms (&iedModel_GenericIO_PTOC1_RstTms) +#define IEDMODEL_GenericIO_PTOC1_RstTms_setVal (&iedModel_GenericIO_PTOC1_RstTms_setVal) +#define IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal (&iedModel_SE_GenericIO_PTOC1_RstTms_setVal) #define IEDMODEL_GenericIO_LTRK1 (&iedModel_GenericIO_LTRK1) #define IEDMODEL_GenericIO_LTRK1_Beh (&iedModel_GenericIO_LTRK1_Beh) #define IEDMODEL_GenericIO_LTRK1_Beh_stVal (&iedModel_GenericIO_LTRK1_Beh_stVal) @@ -604,6 +687,23 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress; #define IEDMODEL_GenericIO_LTRK1_GocbTrk_confRev (&iedModel_GenericIO_LTRK1_GocbTrk_confRev) #define IEDMODEL_GenericIO_LTRK1_GocbTrk_ndsCom (&iedModel_GenericIO_LTRK1_GocbTrk_ndsCom) #define IEDMODEL_GenericIO_LTRK1_GocbTrk_dstAddress (&iedModel_GenericIO_LTRK1_GocbTrk_dstAddress) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk (&iedModel_GenericIO_LTRK1_SgcbTrk) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_objRef (&iedModel_GenericIO_LTRK1_SgcbTrk_objRef) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_serviceType (&iedModel_GenericIO_LTRK1_SgcbTrk_serviceType) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_errorCode (&iedModel_GenericIO_LTRK1_SgcbTrk_errorCode) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_originatorID (&iedModel_GenericIO_LTRK1_SgcbTrk_originatorID) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_t (&iedModel_GenericIO_LTRK1_SgcbTrk_t) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_d (&iedModel_GenericIO_LTRK1_SgcbTrk_d) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_dU (&iedModel_GenericIO_LTRK1_SgcbTrk_dU) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cdcNs (&iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cdcName (&iedModel_GenericIO_LTRK1_SgcbTrk_cdcName) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_dataNs (&iedModel_GenericIO_LTRK1_SgcbTrk_dataNs) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_numOfSG (&iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_actSG (&iedModel_GenericIO_LTRK1_SgcbTrk_actSG) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_editSG (&iedModel_GenericIO_LTRK1_SgcbTrk_editSG) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cnfEdit (&iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_lActTm (&iedModel_GenericIO_LTRK1_SgcbTrk_lActTm) +#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_resvTms (&iedModel_GenericIO_LTRK1_SgcbTrk_resvTms) #endif /* STATIC_MODEL_H_ */ diff --git a/src/iec61850/inc_private/mms_mapping_internal.h b/src/iec61850/inc_private/mms_mapping_internal.h index 920e0df9..fd7c241f 100644 --- a/src/iec61850/inc_private/mms_mapping_internal.h +++ b/src/iec61850/inc_private/mms_mapping_internal.h @@ -291,6 +291,7 @@ struct sMmsMapping { ControlTrkInstance iscTrk; ControlTrkInstance bacTrk; SgcbTrkInstance sgcbTrk; + ServiceTrkInstance genTrk; #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ /* flag indicates if data model is locked --> prevents reports to be sent */ diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 8461b2bd..265605d0 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1264,7 +1264,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) !strcmp(modelNode->name, "BacIntTrk")) { if (DEBUG_IED_SERVER) - printf("%s data object found!\n", modelNode->name); + printf("IED_SERVER: %s data object found!\n", modelNode->name); DataObject* actTrk = (DataObject*) modelNode; ControlTrkInstance* actInstance = NULL; @@ -1306,7 +1306,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) } else if (!strcmp(modelNode->name, "BrcbTrk")) { if (DEBUG_IED_SERVER) - printf("BrcbTrk data object found!\n"); + printf("IED_SERVER: BrcbTrk data object found!\n"); DataObject* brcbTrk = (DataObject*) modelNode; @@ -1330,7 +1330,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) } else if (!strcmp(modelNode->name, "UrcbTrk")) { if (DEBUG_IED_SERVER) - printf("UrcbTrk data object found!\n"); + printf("IED_SERVER: UrcbTrk data object found!\n"); DataObject* urcbTrk = (DataObject*) modelNode; @@ -1353,7 +1353,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) } else if (!strcmp(modelNode->name, "GocbTrk")) { if (DEBUG_IED_SERVER) - printf("GocbTrk data object found!\n"); + printf("IED_SERVER: GocbTrk data object found!\n"); DataObject* gocbTrk = (DataObject*) modelNode; @@ -1376,7 +1376,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) } else if (!strcmp(modelNode->name, "SgcbTrk")) { if (DEBUG_IED_SERVER) - printf("SgcbTrk data object found!\n"); + printf("IED_SERVER: SgcbTrk data object found!\n"); DataObject* sgcbTrk = (DataObject*) modelNode; @@ -1397,6 +1397,28 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode) } } + else if (!strcmp(modelNode->name, "GenTrk")) { + if (DEBUG_IED_SERVER) + printf("IED_SERVER: GenTrk data object found!\n"); + + DataObject* genTrk = (DataObject*) modelNode; + + if (self->genTrk) { + if (DEBUG_IED_SERVER) + printf("IED_SERVER: ERROR: multiple GenTrk instances found in server\n"); + } + else { + /* Setup GenTrk references */ + self->genTrk = (ServiceTrkInstance) GLOBAL_CALLOC(1, sizeof(struct sServiceTrkInstance)); + + if (self->genTrk) { + self->genTrk->dobj = genTrk; + + getCommonTrackingAttributes((ServiceTrkInstance) self->genTrk, genTrk); + } + } + } + modelNode = modelNode->sibling; } @@ -1961,6 +1983,7 @@ MmsMapping_destroy(MmsMapping* self) if (self->iscTrk) GLOBAL_FREEMEM(self->iscTrk); if (self->bacTrk) GLOBAL_FREEMEM(self->bacTrk); if (self->sgcbTrk) GLOBAL_FREEMEM(self->sgcbTrk); + if (self->genTrk) GLOBAL_FREEMEM(self->genTrk); #endif LinkedList_destroy(self->attributeAccessHandlers);