def update_recurse(con, submodel, path): err = -1 if len(path) < 1: logger.error("recusion into model went wrong") err = -1 elif len(path) == 1: if submodel[ path[0] ] and 'reftype' in submodel[ path[0] ] and submodel[ path[0] ]['reftype'] == 'DA': fcName = submodel[ path[0] ]['FC'] #read DA fc = lib61850.FunctionalConstraint_fromString(fcName) error = lib61850.IedClientError() value = lib61850.IedConnection_readObject(con, ctypes.byref(error), ref, fc) if error.value == 0: submodel[ path[0] ]['value'], submodel[ path[0] ]['type'] = iec61850client.printValue(value) lib61850.MmsValue_delete(value) err = 0 else: logger.error("could not read DA: %s from device" % ref) err = -1 else: submodel[ path[0] ] = iec61850client.printDataDirectory(con, ref) if submodel[ path[0] ]:# check if value or empty returned err = 0 else: err = -1 else: submodel[ path[0] ], err = update_recurse(con, submodel[ path[0] ], path[1:]) return submodel, err
def printDataDirectory(con, doRef): tmodel = {} if doRef.find("/") == -1: logger.error("invalid datadirecory") return {} error = lib61850.IedClientError() dataAttributes = lib61850.IedConnection_getDataDirectoryFC( con, ctypes.byref(error), doRef) if error.value != 0: logger.error("could not get logical device list, error:%i" % error.value) if dataAttributes: dataAttribute = lib61850.LinkedList_getNext(dataAttributes) while dataAttribute: daName = ctypes.cast( lib61850.LinkedList_getData(dataAttribute), ctypes.c_char_p).value.decode("utf-8") daRef = doRef + "." + daName[:-4] fcName = daName[-3:-1] submodel = iec61850client.printDataDirectory(con, daRef) if submodel: tmodel[daName[:-4]] = submodel else: tmodel[daName[:-4]] = {} tmodel[daName[:-4]]['reftype'] = "DA" tmodel[daName[:-4]]['FC'] = fcName tmodel[daName[:-4]]['value'] = "UNKNOWN" #read DA fc = lib61850.FunctionalConstraint_fromString(fcName) value = lib61850.IedConnection_readObject( con, ctypes.byref(error), daRef, fc) if error.value == 0: tmodel[daName[:-4]]['value'], tmodel[daName[:-4]][ 'type'] = iec61850client.printValue(value) lib61850.MmsValue_delete(value) dataAttribute = lib61850.LinkedList_getNext(dataAttribute) lib61850.LinkedList_destroy(dataAttributes) return tmodel
def writeValue(con, model, ref, value): submodel, path = iec61850client.parseRef(model,ref) if not submodel: logger.error("cannot find ref: %s in model" % ref) return {},-1 if not 'FC' in submodel: logger.error("ref is not DA") return {},-1 fc = lib61850.FunctionalConstraint_fromString(submodel['FC']) mmsvalue = iec61850client.getMMsValue(submodel['type'],value) if not mmsvalue: return model,-1 error = lib61850.IedClientError() lib61850.IedConnection_writeObject(con, ctypes.byref(error), ref, fc, mmsvalue) lib61850.MmsValue_delete(mmsvalue) if error.value == 0: model, err = iec61850client.updateValueInModel(con, model, ref) return model, err return model, error.value