void ClientReportControlBlock_setRptId(ClientReportControlBlock self, char* rptId) { if (self->rptId == NULL) self->rptId = MmsValue_newVisibleString(rptId); else MmsValue_setVisibleString(self->rptId, rptId); }
void ClientReportControlBlock_setDataSetReference(ClientReportControlBlock self, char* dataSetReference) { if (self->datSet == NULL) self->datSet = MmsValue_newVisibleString(dataSetReference); else MmsValue_setVisibleString(self->datSet, dataSetReference); }
void ClientGooseControlBlock_setDatSet(ClientGooseControlBlock self, const char* datSet) { if (self->datSet == NULL) self->datSet = MmsValue_newVisibleString(datSet); else MmsValue_setVisibleString(self->datSet, datSet); }
void ClientGooseControlBlock_setGoID(ClientGooseControlBlock self, const char* goID) { if (self->goID == NULL) self->goID = MmsValue_newVisibleString(goID); else MmsValue_setVisibleString(self->goID, goID); }
static void initialize(ControlObject* self) { if (emptyString == NULL) emptyString = MmsValue_newVisibleString(NULL); if (!(self->initialized)) { char* ctlModelName = createString(4, self->lnName, "$CF$", self->name, "$ctlModel"); MmsValue* ctlModel = MmsServer_getValueFromCache(self->mmsServer, self->mmsDomain, ctlModelName); free(ctlModelName); if (ctlModel != NULL) { uint32_t ctlModelVal = MmsValue_toInt32(ctlModel); self->ctlModel = ctlModelVal; if ((ctlModelVal == 2) || (ctlModelVal == 4)) { /* SBO */ char* sboTimeoutName = createString(4, self->lnName, "$CF$", self->name, "$sboTimeout"); char* controlObjectReference = createString(6, self->mmsDomain->domainName, "/", self->lnName, "$", self->name, "$SBO"); self->sbo = MmsValue_newVisibleString(controlObjectReference); MmsValue* sboTimeout = MmsServer_getValueFromCache(self->mmsServer, self->mmsDomain, sboTimeoutName); free(controlObjectReference); free(sboTimeoutName); if (sboTimeout != NULL) { uint32_t sboTimeoutVal = MmsValue_toInt32(sboTimeout); self->selectTimeout = sboTimeoutVal; } } else { self->sbo = emptyString; } } self->initialized = true; } }
static void initializeValues() { iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); 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_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example"); iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); }
static void initializeValues() { iedModel_PROT_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); iedModel_PROT_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); iedModel_PROT_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("1.0"); iedModel_PROT_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("Setting group demo"); iedModel_PROT_LLN0_NamPlt_configRev.mmsValue = MmsValue_newVisibleString("1"); iedModel_PROT_LLN0_NamPlt_ldNs.mmsValue = MmsValue_newVisibleString("IEC 61850-7-4:2007"); iedModel_PROT_LPHD1_PhyNam_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); }
static MmsVariableSpecification* createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, ReportControl* reportControl) { MmsVariableSpecification* rcb = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); rcb->name = copyString(reportControlBlock->name); rcb->type = MMS_STRUCTURE; MmsValue* mmsValue = (MmsValue*) calloc(1, sizeof(MmsValue)); mmsValue->deleteValue = false; mmsValue->type = MMS_STRUCTURE; mmsValue->value.structure.size = 15; mmsValue->value.structure.components = (MmsValue**) calloc(15, sizeof(MmsValue*)); rcb->typeSpec.structure.elementCount = 15; rcb->typeSpec.structure.elements = (MmsVariableSpecification**) calloc(15, sizeof(MmsVariableSpecification*)); MmsVariableSpecification* namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("RptID"); namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; rcb->typeSpec.structure.elements[0] = namedVariable; mmsValue->value.structure.components[0] = MmsValue_newVisibleString( reportControlBlock->rptId); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("RptEna"); namedVariable->type = MMS_BOOLEAN; rcb->typeSpec.structure.elements[1] = namedVariable; mmsValue->value.structure.components[1] = MmsValue_newBoolean(false); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("DatSet"); namedVariable->typeSpec.visibleString = -129; namedVariable->type = MMS_VISIBLE_STRING; rcb->typeSpec.structure.elements[2] = namedVariable; if (reportControlBlock->dataSetName != NULL) { char* dataSetReference = createDataSetReferencForDefaultDataSet(reportControlBlock, reportControl); mmsValue->value.structure.components[2] = MmsValue_newVisibleString(dataSetReference); free(dataSetReference); } else mmsValue->value.structure.components[2] = MmsValue_newVisibleString(""); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("ConfRev"); namedVariable->type = MMS_UNSIGNED; namedVariable->typeSpec.unsignedInteger = 32; rcb->typeSpec.structure.elements[3] = namedVariable; mmsValue->value.structure.components[3] = MmsValue_newUnsignedFromUint32(reportControlBlock->confRef); reportControl->confRev = mmsValue->value.structure.components[3]; namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("OptFlds"); namedVariable->type = MMS_BIT_STRING; namedVariable->typeSpec.bitString = 10; rcb->typeSpec.structure.elements[4] = namedVariable; mmsValue->value.structure.components[4] = createOptFlds(reportControlBlock); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("BufTm"); namedVariable->type = MMS_UNSIGNED; namedVariable->typeSpec.unsignedInteger = 32; rcb->typeSpec.structure.elements[5] = namedVariable; mmsValue->value.structure.components[5] = MmsValue_newUnsignedFromUint32(reportControlBlock->bufferTime); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("SqNum"); namedVariable->type = MMS_UNSIGNED; namedVariable->typeSpec.unsignedInteger = 16; rcb->typeSpec.structure.elements[6] = namedVariable; mmsValue->value.structure.components[6] = MmsValue_newUnsigned(16); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("TrgOps"); namedVariable->type = MMS_BIT_STRING; namedVariable->typeSpec.bitString = 6; rcb->typeSpec.structure.elements[7] = namedVariable; mmsValue->value.structure.components[7] = createTrgOps(reportControlBlock); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("IntgPd"); namedVariable->type = MMS_UNSIGNED; namedVariable->typeSpec.unsignedInteger = 32; rcb->typeSpec.structure.elements[8] = namedVariable; mmsValue->value.structure.components[8] = MmsValue_newUnsignedFromUint32(reportControlBlock->intPeriod); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("GI"); namedVariable->type = MMS_BOOLEAN; rcb->typeSpec.structure.elements[9] = namedVariable; mmsValue->value.structure.components[9] = MmsValue_newBoolean(false); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("PurgeBuf"); namedVariable->type = MMS_BOOLEAN; rcb->typeSpec.structure.elements[10] = namedVariable; mmsValue->value.structure.components[10] = MmsValue_newBoolean(false); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("EntryID"); namedVariable->type = MMS_OCTET_STRING; namedVariable->typeSpec.octetString = 8; rcb->typeSpec.structure.elements[11] = namedVariable; mmsValue->value.structure.components[11] = MmsValue_newOctetString(8, 8); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("TimeOfEntry"); namedVariable->type = MMS_BINARY_TIME; rcb->typeSpec.structure.elements[12] = namedVariable; mmsValue->value.structure.components[12] = MmsValue_newBinaryTime(false); reportControl->timeOfEntry = mmsValue->value.structure.components[12]; namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("ResvTms"); namedVariable->type = MMS_UNSIGNED; namedVariable->typeSpec.unsignedInteger = 32; rcb->typeSpec.structure.elements[13] = namedVariable; mmsValue->value.structure.components[13] = MmsValue_newUnsigned(32); namedVariable = (MmsVariableSpecification*) calloc(1, sizeof(MmsVariableSpecification)); namedVariable->name = copyString("Owner"); namedVariable->type = MMS_OCTET_STRING; namedVariable->typeSpec.octetString = -128; rcb->typeSpec.structure.elements[14] = namedVariable; mmsValue->value.structure.components[14] = MmsValue_newOctetString(0, 128); reportControl->rcbValues = mmsValue; return rcb; }
static void initialize(ControlObject* self) { if (!(self->initialized)) { MmsServer mmsServer = IedServer_getMmsServer(self->iedServer); self->emptyString = MmsValue_newVisibleString(NULL); char* ctlModelName = createString(4, self->lnName, "$CF$", self->name, "$ctlModel"); if (DEBUG_IED_SERVER) printf("initialize control for %s\n", ctlModelName); MmsValue* ctlModel = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlModelName); if (ctlModel == NULL) { if (DEBUG_IED_SERVER) printf("No control model found for variable %s\n", ctlModelName); } GLOBAL_FREEMEM(ctlModelName); char* sboClassName = createString(4, self->lnName, "$CF$", self->name, "$sboClass"); self->sboClass = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboClassName); GLOBAL_FREEMEM(sboClassName); self->ctlObjectName = (char*) GLOBAL_MALLOC(130); StringUtils_createStringInBuffer(self->ctlObjectName, 5, MmsDomain_getName(self->mmsDomain), "/", self->lnName, "$CO$", self->name); self->error = MmsValue_newIntegerFromInt32(0); self->addCause = MmsValue_newIntegerFromInt32(0); if (ctlModel != NULL) { uint32_t ctlModelVal = MmsValue_toInt32(ctlModel); self->ctlModel = ctlModelVal; if (DEBUG_IED_SERVER) printf(" ctlModel: %i\n", ctlModelVal); if ((ctlModelVal == 2) || (ctlModelVal == 4)) { /* SBO */ char* sboTimeoutName = createString(4, self->lnName, "$CF$", self->name, "$sboTimeout"); char* controlObjectReference = createString(6, self->mmsDomain->domainName, "/", self->lnName, "$", self->name, "$SBO"); self->sbo = MmsValue_newVisibleString(controlObjectReference); self->sboTimeout = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboTimeoutName); updateSboTimeoutValue(self); setState(self, STATE_UNSELECTED); if (DEBUG_IED_SERVER) printf("timeout for %s is %i\n", sboTimeoutName, self->selectTimeout); GLOBAL_FREEMEM(controlObjectReference); GLOBAL_FREEMEM(sboTimeoutName); } else { self->sbo = MmsValue_newVisibleString(NULL); setState(self, STATE_READY); } } self->initialized = true; } }
int main(int argc, char** argv) { char* hostname; int tcpPort = 102; if (argc > 1) hostname = argv[1]; else hostname = "localhost"; if (argc > 2) tcpPort = atoi(argv[2]); IedClientError error; IedConnection con = IedConnection_create(); IedConnection_connect(con, &error, hostname, tcpPort); if (error == IED_ERROR_OK) { /* read an analog measurement value from server */ MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", MX); if (value != NULL) { float fval = MmsValue_toFloat(value); printf("read float value: %f\n", fval); MmsValue_delete(value); } /* write a variable to the server */ value = MmsValue_newVisibleString("libiec61850.com"); IedConnection_writeObject(con, &error, "simpleIOGenericIO/GGIO1.NamPlt.vendor", DC, value); if (error != IED_ERROR_OK) printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n"); MmsValue_delete(value); /* read data set */ ClientDataSet clientDataSet; clientDataSet = IedConnection_getDataSet(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); if (clientDataSet == NULL) printf("failed to read dataset\n"); printDataSetValues(ClientDataSet_getDataSetValues(clientDataSet)); IedConnection_enableReporting(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB", clientDataSet, TRG_OPT_DATA_UPDATE | TRG_OPT_INTEGRITY, reportCallbackFunction, ClientDataSet_getDataSetValues( clientDataSet)); Thread_sleep(5000); IedConnection_disableReporting(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB"); IedConnection_close(con); } IedConnection_destroy(con); printf("I've done all work. Press anykey..."); getche(); }
IedModel* ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) { int bytesRead = 1; bool stateInModel = false; int indendation = 0; IedModel* model = NULL; LogicalDevice* currentLD = NULL; LogicalNode* currentLN = NULL; ModelNode* currentModelNode = NULL; DataSet* currentDataSet = NULL; GSEControlBlock* currentGoCB = NULL; char nameString[130]; char nameString2[130]; char nameString3[130]; int currentLine = 0; while (bytesRead > 0) { bytesRead = readLine(fileHandle, lineBuffer, READ_BUFFER_MAX_SIZE); currentLine++; if (bytesRead > 0) { lineBuffer[bytesRead] = 0; if (stateInModel) { if (StringUtils_startsWith((char*) lineBuffer, "}")) { if (indendation == 1) { stateInModel = false; indendation = 0; } else if (indendation == 2) { indendation = 1; } else if (indendation == 3) { indendation = 2; } else if (indendation == 4) { indendation = 3; } else if (indendation > 4) { currentModelNode = currentModelNode->parent; indendation--; } } else if (indendation == 1) { if (StringUtils_startsWith((char*) lineBuffer, "LD")) { indendation = 2; if (sscanf((char*) lineBuffer, "LD(%s)", nameString) < 1) goto exit_error; terminateString(nameString, ')'); currentLD = LogicalDevice_create(nameString, model); } else goto exit_error; } else if (indendation == 2) { if (StringUtils_startsWith((char*) lineBuffer, "LN")) { indendation = 3; if (sscanf((char*) lineBuffer, "LN(%s)", nameString) < 1) goto exit_error; terminateString(nameString, ')'); currentLN = LogicalNode_create(nameString, currentLD); } else goto exit_error; } else if (indendation == 3) { if (StringUtils_startsWith((char*) lineBuffer, "DO")) { indendation = 4; int arrayElements = 0; sscanf((char*) lineBuffer, "DO(%s %i)", nameString, &arrayElements); currentModelNode = (ModelNode*) DataObject_create(nameString, (ModelNode*) currentLN, arrayElements); } else if (StringUtils_startsWith((char*) lineBuffer, "DS")) { indendation = 4; sscanf((char*) lineBuffer, "DS(%s)", nameString); terminateString(nameString, ')'); currentDataSet = DataSet_create(nameString, currentLN); } else if (StringUtils_startsWith((char*) lineBuffer, "RC")) { int isBuffered; uint32_t confRef; int trgOps; int options; uint32_t bufTm; uint32_t intgPd; int matchedItems = sscanf((char*) lineBuffer, "RC(%s %s %i %s %u %i %i %u %u)", nameString, nameString2, &isBuffered, nameString3, &confRef, &trgOps, &options, &bufTm, &intgPd); if (matchedItems < 9) goto exit_error; char* rptId = NULL; if (strcmp(nameString2, "-") != 0) rptId = nameString2; char* dataSetName = NULL; if (strcmp(nameString3, "-") != 0) dataSetName = nameString3; ReportControlBlock_create(nameString, currentLN, rptId, (bool) isBuffered, dataSetName, confRef, trgOps, options, bufTm, intgPd); } else if (StringUtils_startsWith((char*) lineBuffer, "LC")) { uint32_t trgOps; uint32_t intgPd; int logEna; int withReasonCode; int matchedItems = sscanf((char*) lineBuffer, "LC(%s %s %s %u %u %i %i)", nameString, nameString2, nameString3, &trgOps, &intgPd, &logEna, &withReasonCode); if (matchedItems < 7) goto exit_error; char* dataSet = NULL; if (strcmp(nameString2, "-") != 0) dataSet = nameString2; char* logRef = NULL; if (strcmp(nameString3, "-") != 0) logRef = nameString3; LogControlBlock_create(nameString, currentLN, dataSet, logRef, trgOps, intgPd, logEna, withReasonCode); } else if (StringUtils_startsWith((char*) lineBuffer, "LOG")) { int matchedItems = sscanf((char*) lineBuffer, "LOG(%s)", nameString); if (matchedItems < 1) goto exit_error; /* remove trailing ')' character */ int nameLen = strlen(nameString); nameString[nameLen - 1] = 0; Log_create(nameString, currentLN); } else if (StringUtils_startsWith((char*) lineBuffer, "GC")) { uint32_t confRef; int fixedOffs; int minTime = -1; int maxTime = -1; int matchedItems = sscanf((char*) lineBuffer, "GC(%s %s %s %u %i %i %i)", nameString, nameString2, nameString3, &confRef, &fixedOffs, &minTime, &maxTime); if (matchedItems < 5) goto exit_error; currentGoCB = GSEControlBlock_create(nameString, currentLN, nameString2, nameString3, confRef, fixedOffs, minTime, maxTime); indendation = 4; } #if (CONFIG_IEC61850_SETTING_GROUPS == 1) else if (StringUtils_startsWith((char*) lineBuffer, "SG")) { if (strcmp(currentLN->name, "LLN0") != 0) { if (DEBUG_IED_SERVER) printf("Setting group control is not defined in LLN0\n"); goto exit_error; } int actSG; int numOfSGs; int matchedItems = sscanf((char*) lineBuffer, "SG(%i %i)", &actSG, &numOfSGs); if (matchedItems < 2) goto exit_error; SettingGroupControlBlock_create(currentLN, actSG, numOfSGs); } #endif /* (CONFIG_IEC61850_SETTING_GROUPS == 1) */ else { if (DEBUG_IED_SERVER) printf("IED_SERVER: Unknown identifier (%s)\n", lineBuffer); goto exit_error; } } else if (indendation > 3) { if (StringUtils_startsWith((char*) lineBuffer, "DO")) { indendation++; int arrayElements = 0; int matchedItems = sscanf((char*) lineBuffer, "DO(%s %i)", nameString, &arrayElements); if (matchedItems != 2) goto exit_error; currentModelNode = (ModelNode*) DataObject_create(nameString, currentModelNode, arrayElements); } else if (StringUtils_startsWith((char*) lineBuffer, "DA")) { int arrayElements = 0; int attributeType = 0; int functionalConstraint = 0; int triggerOptions = 0; uint32_t sAddr = 0; sscanf((char*) lineBuffer, "DA(%s %i %i %i %i %u)", nameString, &arrayElements, &attributeType, &functionalConstraint, &triggerOptions, &sAddr); DataAttribute* dataAttribute = DataAttribute_create(nameString, currentModelNode, (DataAttributeType) attributeType, (FunctionalConstraint) functionalConstraint, triggerOptions, arrayElements, sAddr); char* valueIndicator = strchr((char*) lineBuffer, '='); if (valueIndicator != NULL) { switch (dataAttribute->type) { case IEC61850_UNICODE_STRING_255: { char* stringStart = valueIndicator + 2; terminateString(stringStart, '"'); dataAttribute->mmsValue = MmsValue_newMmsString(stringStart); } break; case IEC61850_VISIBLE_STRING_255: case IEC61850_VISIBLE_STRING_129: case IEC61850_VISIBLE_STRING_65: case IEC61850_VISIBLE_STRING_64: case IEC61850_VISIBLE_STRING_32: { char* stringStart = valueIndicator + 2; terminateString(stringStart, '"'); dataAttribute->mmsValue = MmsValue_newVisibleString(stringStart); } break; case IEC61850_INT8: case IEC61850_INT16: case IEC61850_INT32: case IEC61850_INT64: case IEC61850_INT128: case IEC61850_ENUMERATED: { int32_t intValue; if (sscanf(valueIndicator + 1, "%i", &intValue) != 1) goto exit_error; dataAttribute->mmsValue = MmsValue_newIntegerFromInt32(intValue); } break; case IEC61850_INT8U: case IEC61850_INT16U: case IEC61850_INT24U: case IEC61850_INT32U: { uint32_t uintValue; if (sscanf(valueIndicator + 1, "%u", &uintValue) != 1) goto exit_error; dataAttribute->mmsValue = MmsValue_newUnsignedFromUint32(uintValue); } break; case IEC61850_FLOAT32: { float floatValue; if (sscanf(valueIndicator + 1, "%f", &floatValue) != 1) goto exit_error; dataAttribute->mmsValue = MmsValue_newFloat(floatValue); } break; case IEC61850_FLOAT64: { double doubleValue; if (sscanf(valueIndicator + 1, "%lf", &doubleValue) != 1) goto exit_error; dataAttribute->mmsValue = MmsValue_newDouble(doubleValue); } break; case IEC61850_BOOLEAN: { int boolean; if (sscanf(valueIndicator + 1, "%i", &boolean) != 1) goto exit_error; dataAttribute->mmsValue = MmsValue_newBoolean((bool) boolean); } break; default: break; } } int lineLength = strlen((char*) lineBuffer); if (lineBuffer[lineLength - 1] == '{') { indendation++; currentModelNode = (ModelNode*) dataAttribute; } } else if (StringUtils_startsWith((char*) lineBuffer, "DE")) { sscanf((char*) lineBuffer, "DE(%s)", nameString); terminateString(nameString, ')'); DataSetEntry_create(currentDataSet, nameString, -1, NULL); } else if (StringUtils_startsWith((char*) lineBuffer, "PA")) { uint32_t vlanPrio; uint32_t vlanId; uint32_t appId; int matchedItems = sscanf((char*) lineBuffer, "PA(%u %u %u %s)", &vlanPrio, &vlanId, &appId, nameString); if ((matchedItems != 4) || (currentGoCB == NULL)) goto exit_error; terminateString(nameString, ')'); if (strlen(nameString) != 12) goto exit_error; if (StringUtils_createBufferFromHexString(nameString, (uint8_t*) nameString2) != 6) goto exit_error; PhyComAddress* dstAddress = PhyComAddress_create((uint8_t) vlanPrio, (uint16_t) vlanId, (uint16_t) appId, (uint8_t*) nameString2); GSEControlBlock_addPhyComAddress(currentGoCB, dstAddress); } else goto exit_error; } } else { if (StringUtils_startsWith((char*) lineBuffer, "MODEL{")) { model = IedModel_create(""); stateInModel = true; indendation = 1; } else if (StringUtils_startsWith((char*) lineBuffer, "MODEL(")) { sscanf((char*) lineBuffer, "MODEL(%s)", nameString); terminateString(nameString, ')'); model = IedModel_create(nameString); stateInModel = true; indendation = 1; } else goto exit_error; } } } return model; exit_error: if (DEBUG_IED_SERVER) printf("IED_SERVER: error parsing line %i (indendation level = %i)\n", currentLine, indendation); IedModel_destroy(model); return NULL; }
int main(int argc, char** argv) { char* hostname; int tcpPort = 102; if (argc > 1) hostname = argv[1]; else hostname = "localhost"; if (argc > 2) tcpPort = atoi(argv[2]); IedClientError error; IedConnection con = IedConnection_create(); IedConnection_connect(con, &error, hostname, tcpPort); if (error == IED_ERROR_OK) { /* read an analog measurement value from server */ MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX); if (value != NULL) { float fval = MmsValue_toFloat(value); printf("read float value: %f\n", fval); MmsValue_delete(value); } /* write a variable to the server */ value = MmsValue_newVisibleString("libiec61850.com"); IedConnection_writeObject(con, &error, "simpleIOGenericIO/GGIO1.NamPlt.vendor", IEC61850_FC_DC, value); if (error != IED_ERROR_OK) printf("failed to write simpleIOGenericIO/GGIO1.NamPlt.vendor!\n"); else MmsValue_delete(value); /* read data set */ ClientDataSet clientDataSet = IedConnection_readDataSetValues(con, &error, "simpleIOGenericIO/LLN0.Events", NULL); if (clientDataSet == NULL) printf("failed to read dataset\n"); /* Read RCB values */ ClientReportControlBlock rcb = IedConnection_getRCBValues(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01", NULL); bool rptEna = ClientReportControlBlock_getRptEna(rcb); printf("RptEna = %i\n", rptEna); /* Install handler for reports */ IedConnection_installReportHandler(con, "simpleIOGenericIO/LLN0.RP.EventsRCB01", ClientReportControlBlock_getRptId(rcb), reportCallbackFunction, NULL); /* Set trigger options and enable report */ ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_DATA_UPDATE | TRG_OPT_INTEGRITY | TRG_OPT_GI); ClientReportControlBlock_setRptEna(rcb, true); ClientReportControlBlock_setIntgPd(rcb, 5000); IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_TRG_OPS | RCB_ELEMENT_INTG_PD, true); if (error != IED_ERROR_OK) printf("report activation failed (code: %i)\n", error); Thread_sleep(1000); /* trigger GI report */ ClientReportControlBlock_setGI(rcb, true); IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true); if (error != IED_ERROR_OK) printf("Error triggering a GI report (code: %i)\n", error); Thread_sleep(60000); /* disable reporting */ ClientReportControlBlock_setRptEna(rcb, false); IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_RPT_ENA, true); if (error != IED_ERROR_OK) printf("disable reporting failed (code: %i)\n", error); ClientDataSet_destroy(clientDataSet); close_connection: IedConnection_close(con); } else { printf("Failed to connect to %s:%i\n", hostname, tcpPort); } IedConnection_destroy(con); }