예제 #1
0
		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
예제 #3
0
	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