From 35e824a8f80380477da0109d3e043a80a09861b0 Mon Sep 17 00:00:00 2001 From: Susa Giogoli <su.giogoli@icloud.com> Date: Wed, 12 Jul 2023 13:38:24 +0200 Subject: [PATCH] Enums can be generated now althought only with strings as varianttypes --- newmodeljsonparse.py | 31 +++++------ writefile.py | 120 +++++++++++++++++++++++++++++-------------- 2 files changed, 95 insertions(+), 56 deletions(-) diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py index e6ee926..2c85af9 100644 --- a/newmodeljsonparse.py +++ b/newmodeljsonparse.py @@ -22,11 +22,12 @@ def functionJsonDecod(functiondict): #Measurement class that can be instantiated using JsonDecod functions class Measurement: - def __init__(self, name, description, datatype, value, dimension, unit=None, range=None): + def __init__(self, name, description, datatype, value, uuid, dimension, unit=None, range=None): self.name = name self.description = description self.datatype = datatype self.range = range + self.uuid = uuid self.dimension = dimension self.unit = unit array = [] @@ -38,7 +39,7 @@ class Measurement: #Parameter class that can be instantiated using JsonDecod functions class Parameter: - def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False): + def __init__(self, name, description, datatype, dimension, value, uuid, rangevar=None, unit=None, default=None, constant=False): self.name = name self.description = description self.datatype = datatype @@ -46,6 +47,7 @@ class Parameter: # self.range = None # else: self.range = rangevar + self.uuid = uuid self.dimension = dimension self.unit = unit self.default = default @@ -275,7 +277,7 @@ def getStreams(list1, component, jsoncomponents): return list1 -def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone): +def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames): for obj in jsoninterfaces: rootobj = {} if obj["elementType"] == "interface": @@ -292,16 +294,16 @@ def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponen objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements) #print(objmeasurementlist) measurementsobjs = getMeasurements(objmeasurementlist) - wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])]) + wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])], enumnodedict, enumvalues, enumnames) variablelist = getVariables([], rootobj, jsoncomponents) variabledict[obj["uuid"]] = variablelist objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters) parameterobjs = getParameters(objparameterlist) - wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])]) + wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])], enumnodedict, enumvalues, enumnames) objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions) functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements) wf.writefunction(functionobj, interfacesreturn[str(obj["name"])]) - buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone) + buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames) return interfacesreturn, variabledict @@ -377,26 +379,19 @@ def main(): jsoncomponents.append(obj) elif obj["elementType"] == "interface": jsoninterfaces.append(obj) - elif obj["elementType"] == "enum": jsonenums.append(obj) - returnComponents = buildComponents({}, {}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, []) + returnvalenums = wf.writeenums(jsonenums) + enumnodedict = returnvalenums[0] + enumvalues = returnvalenums[1] + enumnames = returnvalenums[2] + returnComponents = buildComponents({}, {}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [], enumnodedict, enumvalues, enumnames) typesdict = returnComponents[0] variabledict = returnComponents[1] - print("Variabledict: ") - print(variabledict) returnval = instantiate(typesdict, jsoninterfaces, jsoncomponents) instantiatedict = returnval[0] eventsdict = returnval[1] streamsdict = returnval[2] - print("Streamsdict:") - print(streamsdict) - print("Instantiatedict: ") - print(instantiatedict) - print("Eventsdict: ") - print(eventsdict) - print("Parametersdict: ") - print(jsonparameters) generatordict = {} streamgendict = {} savestreamvaldict = {} diff --git a/writefile.py b/writefile.py index d9cb673..ce64ffc 100644 --- a/writefile.py +++ b/writefile.py @@ -81,6 +81,27 @@ _logger = logging.getLogger('asyncua') measurementtype = await server.nodes.base_data_type.add_data_type(idx, "Measurement") parametertype = await server.nodes.base_data_type.add_data_type(idx, "Parameter") """) + +def writeenums(enumslist): + server = open("opcua-server.py", "a") + writeindent = " " + returnvalues = {} + enumnodenames = {} + variantnames = {} + for enum in enumslist: + returnvallist = [] + enumname = (enum["name"].lower()).replace(" ", "") + values = enum["values"] + for i in range(len(values)): + retval = str(i) + ":" + str(values[i]) + returnvallist.append(retval) + server.write(writeindent + enumname + "= await new_enum(server, idx, \""+ str(enum["name"]) + "\", values=" + str(enum["values"]) + ")\n") + enumnodenames[enum["uuid"]] = enumname + returnvalues[enum["uuid"]] = returnvallist + variantnames[enum["uuid"]] = enum["name"] + return enumnodenames, returnvalues, variantnames + + def openobject(objname, description): server = open("opcua-server.py", "a") writeindent = " " @@ -107,27 +128,47 @@ def writecomponents(headnode, componentslist, typesdict): server.write(writeindent + "await " + objname + "." + "set_modelling_rule(True)\n") -def writemeasurement(measurementobj, headnode): +def writeenumobj(variable, headnode, enumnodedict, enumvaldict, enumvariantdict): + server = open("opcua-server.py", "a") + writeindent = " " + uuid = variable.uuid + varname = (variable.name.lower()).replace(" ","") + "var" + server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx, \"" + variable.name + "\", " + variable.value + ", datatype=" + enumnodedict[variable.uuid] + ".nodeid)\n") + server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") + i = 0 + for value in enumvaldict[variable.uuid]: + valname = "value" + str(i) + server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n") + server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n") + i += 1 + return varname + + +def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumvariantdict): server = open("opcua-server.py", "a") writeindent = " " measurementdict = {} for i in measurementobj: - varianttype = getVariantType(i.datatype) - datatype = "measurementtype.nodeid" - varname = ((i.name).lower()).replace(" ", "") + "var" - measurementdict[i.name] = varname - server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str( - i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") - server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") - if i.range is not None and i.range != [None, None]: - rangename = "rangeprop" - server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n") - server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") - if i.unit != "UNITLESS": - unitname = "unitprop" - server.write( - writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") - server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") + if i.datatype == "enum": + varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict) + measurementdict[i.name] = varname + else: + varianttype = getVariantType(i.datatype) + datatype = "measurementtype.nodeid" + varname = ((i.name).lower()).replace(" ", "") + "var" + measurementdict[i.name] = varname + server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str( + i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") + server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") + if i.range is not None and i.range != [None, None]: + rangename = "rangeprop" + server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n") + server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") + if i.unit != "UNITLESS": + unitname = "unitprop" + server.write( + writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") + server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") server.write( writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") @@ -137,32 +178,37 @@ def writemeasurement(measurementobj, headnode): return measurementdict -def writeparameter(parameterobj, headnode): +def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvariantdict): writeindent = " " server = open("opcua-server.py", "a") parameterdict = {} for i in parameterobj: - varianttype = getVariantType(i.datatype) - datatype = "parametertype.nodeid" - varname = ((i.name).lower()).replace(" ", "") + "var" - parameterdict[i.name] = varname - server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str( - i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") - server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") - if i.range is not None and i.range != [None, None]: - rangename = "rangeprop" - server.write( - writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n") - server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") - if i.unit != "UNITLESS": - unitname = "unitprop" - server.write( - writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") - server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") + if i.datatype == "enum": + varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict) + parameterdict[i.name] = varname + else: + varianttype = getVariantType(i.datatype) + datatype = "parametertype.nodeid" + varname = ((i.name).lower()).replace(" ", "") + "var" + parameterdict[i.name] = varname + server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str( + i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") + server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") + if i.range is not None and i.range != [None, None]: + rangename = "rangeprop" + server.write( + writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + ", " + str(i.range[1]) + "))\n") + server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") + if i.unit != "UNITLESS": + unitname = "unitprop" + server.write( + writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") + server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") server.write( writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") - server.write(writeindent + "await " + varname+ "description.set_modelling_rule(True)\n\n") + server.write(writeindent + "await " + varname + "description.set_modelling_rule(True)\n\n") + return parameterdict def writefunction(functionobj, headnode): @@ -243,9 +289,7 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements if stream["streamType"] == "update": value = 0 - print(variablelist) for variable in variablelist: - print(variable) if variable["name"] == stream["measurement"]: for measurement in jsonmeasurements: if measurement["uuid"] == variable["value"]: -- GitLab