- IED server: RCB and LCB service tracking replaced $ with . characters in object references

pull/265/head
Michael Zillgith 5 years ago
parent 5e520f21b5
commit ec5ccb62a0

@ -278,7 +278,7 @@ struct sLogControlBlock {
char* name; char* name;
char* dataSetName; char* dataSetName;
char* logRef; /* object reference to the journal. Defaults to <MMS DomainName>/<LNName>$GeneralLog */ char* logRef; /* object reference to the journal */
uint8_t trgOps; /* TrgOps - trigger conditions */ uint8_t trgOps; /* TrgOps - trigger conditions */
uint32_t intPeriod; /* IntgPd - integrity period */ uint32_t intPeriod; /* IntgPd - integrity period */

@ -46,6 +46,8 @@ typedef struct {
LogControlBlock* logControlBlock; LogControlBlock* logControlBlock;
MmsMapping* mmsMapping; MmsMapping* mmsMapping;
char* logRef;
DataSet* dataSet; DataSet* dataSet;
char* dataSetRef; char* dataSetRef;
bool isDynamicDataSet; bool isDynamicDataSet;

@ -181,6 +181,7 @@ LogControl_create(LogicalNode* parentLN, MmsMapping* mmsMapping)
self->logInstance = NULL; self->logInstance = NULL;
self->intgPd = 0; self->intgPd = 0;
self->nextIntegrityScan = 0; self->nextIntegrityScan = 0;
self->logRef = NULL;
return self; return self;
} }
@ -196,6 +197,9 @@ LogControl_destroy(LogControl* self)
if (self->dataSetRef != NULL) if (self->dataSetRef != NULL)
GLOBAL_FREEMEM(self->dataSetRef); GLOBAL_FREEMEM(self->dataSetRef);
if (self->logRef)
GLOBAL_FREEMEM(self->logRef);
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }
} }
@ -412,10 +416,22 @@ copyLCBValuesToTrackingObject(MmsMapping* self, LogControl* logControl)
MmsValue_setBoolean(trkInst->logEna->mmsValue, logControl->enabled); MmsValue_setBoolean(trkInst->logEna->mmsValue, logControl->enabled);
if (trkInst->logRef) if (trkInst->logRef)
MmsValue_setVisibleString(trkInst->logRef->mmsValue, logControl->logControlBlock->logRef); MmsValue_setVisibleString(trkInst->logRef->mmsValue, logControl->logRef);
if (trkInst->datSet) { if (trkInst->datSet) {
MmsValue_setVisibleString(trkInst->datSet->mmsValue, logControl->dataSetRef); char datSet[130];
if (logControl->dataSetRef) {
strncpy(datSet, logControl->dataSetRef, 129);
datSet[129] = 0;
StringUtils_replace(datSet, '$', '.');
}
else {
datSet[0] = 0;
}
MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet);
} }
if (trkInst->intgPd) if (trkInst->intgPd)
@ -776,6 +792,10 @@ createLogControlBlock(MmsMapping* self, LogControlBlock* logControlBlock,
strncat(logRef, logControlBlock->logRef, maxLogRefLength); strncat(logRef, logControlBlock->logRef, maxLogRefLength);
mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef); mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef);
StringUtils_replace(logRef, '$', '.');
logControl->logRef = StringUtils_copyString(logRef);
} }
else { else {
char* logRef = StringUtils_createString(4, logControl->domain->domainName, "/", logControlBlock->parent->name, char* logRef = StringUtils_createString(4, logControl->domain->domainName, "/", logControlBlock->parent->name,
@ -783,7 +803,9 @@ createLogControlBlock(MmsMapping* self, LogControlBlock* logControlBlock,
mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef); mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef);
GLOBAL_FREEMEM(logRef); StringUtils_replace(logRef, '$', '.');
logControl->logRef = logRef;
} }
/* DatSet */ /* DatSet */

@ -630,13 +630,15 @@ private_IedServer_convertMmsDataAccessErrorToServiceError(MmsDataAccessError mms
errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INAPPROPRIATE; errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INAPPROPRIATE;
break; break;
case DATA_ACCESS_ERROR_TYPE_INCONSISTENT: case DATA_ACCESS_ERROR_TYPE_INCONSISTENT:
case DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT:
errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INCONSISTENT; errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INCONSISTENT;
break; break;
case DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT: case DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT:
errVal = IEC61850_SERVICE_ERROR_INSTANCE_NOT_AVAILABLE; errVal = IEC61850_SERVICE_ERROR_INSTANCE_NOT_AVAILABLE;
break; break;
default: default:
printf("Data access error %i not mapped!\n", mmsError); if (DEBUG_IED_SERVER)
printf("IED_SERVER: Data access error %i not mapped!\n", mmsError);
errVal = IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT; errVal = IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT;
break; break;
} }

@ -324,8 +324,19 @@ copyRCBValuesToTrackingObject(MmsMapping* self, ReportControl* rc)
if (trkInst->rptEna) if (trkInst->rptEna)
MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "RptEna")); MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "RptEna"));
if (trkInst->datSet) if (trkInst->datSet) {
MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet")); char datSet[130];
const char* datSetStr = MmsValue_toString(ReportControl_getRCBValue(rc, "DatSet"));
if (datSetStr) {
strncpy(datSet, datSetStr, 129);
datSet[129] = 0;
StringUtils_replace(datSet, '$', '.');
MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet);
}
}
if (trkInst->confRev) if (trkInst->confRev)
MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev")); MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev"));
@ -383,8 +394,19 @@ copyRCBValuesToTrackingObject(MmsMapping* self, ReportControl* rc)
if (trkInst->resv) if (trkInst->resv)
MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "Resv")); MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "Resv"));
if (trkInst->datSet) if (trkInst->datSet) {
MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet")); char datSet[130];
const char* datSetStr = MmsValue_toString(ReportControl_getRCBValue(rc, "DatSet"));
if (datSetStr) {
strncpy(datSet, datSetStr, 129);
datSet[129] = 0;
StringUtils_replace(datSet, '$', '.');
MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet);
}
}
if (trkInst->confRev) if (trkInst->confRev)
MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev")); MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev"));
@ -423,8 +445,20 @@ updateSingleTrackingValue(MmsMapping* self, ReportControl* rc, char* name, MmsVa
attributeToUpdate = trkInst->rptID; attributeToUpdate = trkInst->rptID;
else if (!strcmp(name, "RptEna")) else if (!strcmp(name, "RptEna"))
attributeToUpdate = trkInst->rptEna; attributeToUpdate = trkInst->rptEna;
else if (!strcmp(name, "DatSet")) else if (!strcmp(name, "DatSet")) {
attributeToUpdate = trkInst->datSet;
char datSet[130];
const char* datSetStr = MmsValue_toString(newValue);
if (datSetStr) {
strncpy(datSet, datSetStr, 129);
datSet[129] = 0;
StringUtils_replace(datSet, '$', '.');
MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet);
}
}
else if (!strcmp(name, "ConfRev")) else if (!strcmp(name, "ConfRev"))
attributeToUpdate = trkInst->confRev; attributeToUpdate = trkInst->confRev;
else if (!strcmp(name, "OptFlds")) else if (!strcmp(name, "OptFlds"))
@ -464,8 +498,20 @@ updateSingleTrackingValue(MmsMapping* self, ReportControl* rc, char* name, MmsVa
attributeToUpdate = trkInst->rptEna; attributeToUpdate = trkInst->rptEna;
else if (!strcmp(name, "Resv")) else if (!strcmp(name, "Resv"))
attributeToUpdate = trkInst->resv; attributeToUpdate = trkInst->resv;
else if (!strcmp(name, "DatSet")) else if (!strcmp(name, "DatSet")) {
attributeToUpdate = trkInst->datSet;
char datSet[130];
const char* datSetStr = MmsValue_toString(newValue);
if (datSetStr) {
strncpy(datSet, datSetStr, 129);
datSet[129] = 0;
StringUtils_replace(datSet, '$', '.');
MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet);
}
}
else if (!strcmp(name, "ConfRev")) else if (!strcmp(name, "ConfRev"))
attributeToUpdate = trkInst->confRev; attributeToUpdate = trkInst->confRev;
else if (!strcmp(name, "OptFlds")) else if (!strcmp(name, "OptFlds"))

Loading…
Cancel
Save