libiec61850/examples/server_example_setting_groups/server_example_sg.c

150 lines
4.3 KiB
C

/*
* server_example_sg.c
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
/* Include the generated header with the model access handles */
#include "static_model.h"
/* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel;
static IedServer iedServer;
static int running = 0;
typedef struct {
float strVal;
int opDlTmms;
int rsDlTmms;
int rstTms;
} PTOC1Settings;
static PTOC1Settings ptoc1Settings[] = {
{1.0f, 500, 500, 500},
{2.0f, 1500, 2500, 750},
{3.0f, 500, 1500, 750},
{3.5f, 1250, 1750, 500},
{3.75f, 1250, 1750, 750}
};
void sigint_handler(int signalId)
{
running = 0;
}
static void
loadActiveSgValues (int actSG)
{
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_PROT_PTOC1_StrVal_setMag_f, ptoc1Settings[actSG - 1].strVal);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_OpDlTmms_setVal, ptoc1Settings[actSG - 1].opDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_RsDlTmms_setVal, ptoc1Settings[actSG - 1].rsDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_PROT_PTOC1_RstTms_setVal, ptoc1Settings[actSG - 1].rstTms);
}
static void
loadEditSgValues (int editSG)
{
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_StrVal_setMag_f, ptoc1Settings[editSG - 1].strVal);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_OpDlTmms_setVal, ptoc1Settings[editSG - 1].opDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_RsDlTmms_setVal, ptoc1Settings[editSG - 1].rsDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_PROT_PTOC1_RstTms_setVal, ptoc1Settings[editSG - 1].rstTms);
}
static bool
activeSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
uint8_t newActSg, ClientConnection connection)
{
printf("Switch to setting group %i\n", (int) newActSg);
loadActiveSgValues(newActSg);
return true;
}
static bool
editSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
uint8_t newEditSg, ClientConnection connection)
{
printf("Set edit setting group to %i\n", (int) newEditSg);
loadEditSgValues(newEditSg);
return true;
}
static void
editSgConfirmedHandler(void* parameter, SettingGroupControlBlock* sgcb,
uint8_t editSg)
{
printf("Received edit sg confirm for sg %i\n", editSg);
ptoc1Settings[editSg - 1].strVal = MmsValue_toFloat(IEDMODEL_SE_PROT_PTOC1_StrVal_setMag_f->mmsValue);
ptoc1Settings[editSg - 1].opDlTmms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_OpDlTmms_setVal->mmsValue);
ptoc1Settings[editSg - 1].rsDlTmms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_RsDlTmms_setVal->mmsValue);
ptoc1Settings[editSg - 1].rstTms = MmsValue_toInt32(IEDMODEL_SE_PROT_PTOC1_RstTms_setVal->mmsValue);
if (IedServer_getActiveSettingGroup(iedServer, sgcb) == editSg) {
loadActiveSgValues(editSg);
}
}
int
main(int argc, char** argv)
{
iedServer = IedServer_create(&iedModel);
LogicalDevice* ld = IEDMODEL_PROT;
SettingGroupControlBlock* sgcb = LogicalDevice_getSettingGroupControlBlock(ld);
loadActiveSgValues(sgcb->actSG);
IedServer_setActiveSettingGroupChangedHandler(iedServer, sgcb, activeSgChangedHandler, NULL);
IedServer_setEditSettingGroupChangedHandler(iedServer, sgcb, editSgChangedHandler, NULL);
IedServer_setEditSettingGroupConfirmationHandler(iedServer, sgcb, editSgConfirmedHandler, NULL);
/* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, 102);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
float power = 500.f;
while (running) {
uint64_t timeval = Hal_getTimeInMs();
IedServer_lockDataModel(iedServer);
IedServer_unlockDataModel(iedServer);
power += 0.1f;
Thread_sleep(500);
}
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
return 0;
} /* main() */