149 lines
4.3 KiB
C
149 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() */
|