diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py index 2c85af9f900c76dddaf3ffb4b28cab82aee5a5c0..533f08093231bdc654e0191c38d54c62bf739aa0 100644 --- a/newmodeljsonparse.py +++ b/newmodeljsonparse.py @@ -68,9 +68,10 @@ class Parameter: #Function class that can be instantiated using JsonDecod functions class Function: - def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None): + def __init__(self, name, description, uuid, inargsdatatypes = None, outargsdatatypes = None): self.name = name self.description = description + self.uuid = uuid self.inargsdatatypes = inargsdatatypes self.outargsdatatypes = outargsdatatypes @@ -255,6 +256,17 @@ def getVariables(list1, interface, jsoncomponents): return list1 +def getFunctionVariables(list1, interface, jsoncomponents): + variablelist = interface["functions"] + list1 = list1 + variablelist + if iskeythere(list(interface.keys()), "baseComponent"): + for component in jsoncomponents: + if component["uuid"] == interface["baseComponent"]: + return getFunctionVariables(list1, component, jsoncomponents) + else: + return list1 + + def getEvents(list1, component, jsoncomponents): for event in component["events"]: list1.append(event) @@ -302,7 +314,8 @@ def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponen 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"])]) + functionvars = getFunctionVariables([], rootobj, jsoncomponents) + wf.writefunction(functionobj, interfacesreturn[str(obj["name"])], functionvars) buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames) return interfacesreturn, variabledict @@ -339,7 +352,7 @@ def instantiate(typesdict, interfaces, jsoncomponents): events = getEvents([], root, jsoncomponents) streams = getStreams([], root, jsoncomponents) components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents) - instantiatedict[str(interface["uuid"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count) + instantiatedict[str(interface["uuid"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"]) eventsdict[str(interface["uuid"])] = events streamsdict[str(interface["uuid"])] = streams return instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict, eventsdict, streamsdict) diff --git a/writefile.py b/writefile.py index a39c2efaa231941b2d477cc89583716616eab934..f38cdff50caaf9498c6caf519a064271a2dd450b 100644 --- a/writefile.py +++ b/writefile.py @@ -3,7 +3,7 @@ import tomli """ This File takes the prepared Data structures and writes the OPC-UA Server based on them. - Methods: defFunction, getVariantType, writebeginning, writeenums, openobject, writeenumobj, writemeasurement, writeparameter, + Methods: defFunction, getVariantType, writebeginning, writeenums, openobject, writemeasurement, writeparameter, writefunction, writeobjects, writeinterface, writeevents, writestreams, writendpt1, triggerevents, triggerstreams, writendpt2 """ @@ -158,36 +158,10 @@ def openobject(objname, description): writeindent = " " server.write(writeindent + "#creating the objecttype\n") objtypename = (objname.lower()).replace(" ", "") + "type" - server.write(writeindent + objtypename + "= await server.nodes.base_object_type.add_object_type(idx, \"" + objname +"\" )\n") + server.write(writeindent + objtypename + "= await server.nodes.base_object_type.add_object_type(idx, \"" + objname + "\" )\n\n") return objtypename -def writeenumobj(variable, headnode, enumnodedict, enumvaldict, enumvariantdict): - """ - Creates the variables with the type enum. - :param variable: the variableobject that is created - :param headnode: the component to which the variable belongs - :param enumnodedict: Dict of the format {enum uuid: enum opc ua nodename} - :param enumvaldict: Dict of the format {enum uuid: changed values for the propertie names} - (same as returnvalues from writeenums) - :param enumvariantdict: Dict of the format {enum uuid: enum name} - :return: name of the created variablenode - """ - 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): #ToDo: Schauen ob man returns rausnehmen kann """ @@ -197,20 +171,28 @@ def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumva :param enumnodedict: Dict for the names of the enum nodes from writeenums (used for writeenumobj) :param enumvaldict: Dict for the enumvalues from writenums (used for writeenumobj) :param enumvariantdict: Dict for the name of the enums (used for writeenumobj) - :return: a dict for the measurement node names + :return: None """ server = open("opcua-server.py", "a") writeindent = " " measurementdict = {} + if len(measurementobj) > 0: + server.write(writeindent + "# measurements for " + headnode + "\n") for i in measurementobj: + varname = ((i.name).lower()).replace(" ", "") + "var" if i.datatype == "enum": - varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict) measurementdict[i.name] = varname + server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx, \"" + i.name + "\", " + i.value + ", datatype=" + enumnodedict[i.uuid] + ".nodeid)\n") + server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") + count = 0 + for value in enumvaldict[i.uuid]: + valname = "value" + str(count) + 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 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") @@ -223,14 +205,10 @@ def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumva 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("\n" + writeindent + "#creating all parameters with their properties\n") - return measurementdict - def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvariantdict): """ @@ -240,15 +218,24 @@ def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvarian :param enumnodedict: Dict for the names of the enum nodes from writeenums (used for writeenumobj) :param enumvaldict: Dict for the enumvalues from writenums (used for writeenumobj) :param enumvariantdict: Dict for the name of the enums (used for writeenumobj) - :return: A dict with the node names of the parameters + :return: None """ writeindent = " " server = open("opcua-server.py", "a") parameterdict = {} + if len(parameterobj) > 0: + server.write(writeindent + "# parameters for " + headnode + "\n") for i in parameterobj: if i.datatype == "enum": - varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict) - parameterdict[i.name] = varname + varname = (i.name.lower()).replace(" ", "") + "var" + server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx, \"" + i.name + "\", " + i.value + ", datatype=" + enumnodedict[i.uuid] + ".nodeid)\n") + server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") + count = 0 + for value in enumvaldict[i.uuid]: + valname = "value" + str(count) + server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n") + server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n") + count += 1 else: varianttype = getVariantType(i.datatype) datatype = "parametertype.nodeid" @@ -271,20 +258,27 @@ def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvarian 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") - return parameterdict -def writefunction(functionobj, headnode): +def writefunction(functionobj, headnode, functionlist): """ Takes the function objects writes the function body by calling deffunction and adds it to the objecttypes :param functionobj: List of functionobjects :param headnode: component the functions belong to + :param functionlist: List of all functions from the component with the Format {name: value} :return: None """ server = open("opcua-server.py", "a") writeindent = " " + functionname = "" for i in functionobj: - functionname = (i.name.lower()).replace(" ", "") + print(i) + for fobj in functionlist: + if fobj["value"] == i.uuid: + print(fobj["name"]) + functionname = (fobj["name"].lower()).replace(" ", "") + functionlist.remove(fobj) + break defFunction(functionname, server, 1, i.inargsnames, i) server.write("\n") inargslist = [] @@ -313,25 +307,25 @@ def writeobjects(objtype, objname, headnode, count): """ server = open("opcua-server.py", "a") writeindent = " " + server.write(writeindent + "# creating object \n") objtypename = (objname.lower()).replace(" ", "") + "var" + str(count) server.write( - writeindent + objtypename + "= await " + headnode + ".add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n") + writeindent + objtypename + "= await " + headnode + ".add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n\n") return objtypename -def writeinterface(objtype, objname, count): +def writeinterface(objtype, objname): """ Generates the interface, meaning the highest object layer. (Works similar to writeobjects) :param objtype: The name of the node with the objecttype :param objname: The name of the object - :param count: (Currently not really implemented) but for counting the names up - if an object with the same name is instantiated twice. :return: The name of the newly created objectnode """ server = open("opcua-server.py", "a") writeindent = " " - objtypename = (objname.lower()).replace(" ","") + "var" + str(count) - server.write(writeindent + objtypename + "= await server.nodes.objects.add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n") + server.write(writeindent + "# creating Interface\n") + objtypename = (objname.lower()).replace(" ","") + "var" + server.write(writeindent + objtypename + "= await server.nodes.objects.add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n\n") return objtypename @@ -345,6 +339,8 @@ def writeevents(events, component, eventlist): """ server = open("opcua-server.py", "a") writeindent = " " + if len(events) > 0: + server.write(writeindent + "# creating event and eventgenerators for " + component + "\n") for event in events: eventname = (event["element"].lower()).replace(" ", "") + component + str(event["severity"]) eventgenname = eventname + "generator" @@ -362,7 +358,7 @@ def writeevents(events, component, eventlist): severity = 1000 server.write(writeindent + eventname + " = await server.create_custom_event_type(idx, \"" + str(event["element"]) + " " + str(event["severity"]) + "\", ua.ObjectIds.SystemEventType)\n") server.write(writeindent + str(eventlist[eventname]) + " = await server.get_event_generator(" + eventname + ", " + component + ")\n") - server.write(writeindent + str(eventlist[eventname]) + ".event.Severity = " + str(severity) + "\n") + server.write(writeindent + str(eventlist[eventname]) + ".event.Severity = " + str(severity) + "\n\n") return eventlist @@ -383,6 +379,8 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements server = open("opcua-server.py", "a") writeindent = " " updatestreamdict = {} + if len(streamslist) > 0: + server.write(writeindent + "# creating events and event generators for" + component + "\n") for stream in streams: streamname = (stream["measurement"].lower()).replace(" ", "") + component streamgenname = streamname + "generator" @@ -407,7 +405,7 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements writevalue = "\"" + value + "\"" else: writevalue = str(value) - server.write(writeindent + savevaluename + " = " + writevalue + "\n") + server.write(writeindent + savevaluename + " = " + writevalue + "\n\n") updatestreamdict[streamname] = savevaluename return streamslist, updatestreamdict @@ -443,6 +441,8 @@ def triggerevents(generatordict, eventslist, component, variablelist, jsonmeasur indent = 3 writeindent = "" variablenamelist = {} + if len(eventslist) > 0: + server.write(" # triggering events from " + component + "\n") for event in eventslist: writeindent = "" for i in range(indent): @@ -471,7 +471,7 @@ def triggerevents(generatordict, eventslist, component, variablelist, jsonmeasur trigger = "\"" + str(event["target"] + "\"") server.write(writeindent + "if (await " + valuename + ".get_value()) " + event["trigger"] + " " + trigger + ":\n") writeindent += " " - server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + event["message"] + "\")\n") + server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + event["message"] + "\")\n\n") writeindent = "" for i in range(indent): writeindent += " " @@ -493,6 +493,8 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas """ server = open("opcua-server.py", "a") indent = 3 + if len(streamslist) > 0: + server.write(" # triggering streams from " + component + "\n") for stream in streamslist: writeindent = "" streamname = "" @@ -514,7 +516,7 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas writeindent += " " server.write(writeindent + "puffer = await " + valuename + ".get_value()\n") server.write(writeindent + "await " + generatorname + ".trigger(message= \"value\" + str(puffer))\n") - server.write(writeindent + savevaldict[(stream["measurement"].lower()).replace(" ", "") + component] + " = puffer \n") + server.write(writeindent + savevaldict[(stream["measurement"].lower()).replace(" ", "") + component] + " = puffer \n\n") writeindent = "" for i in range(indent): writeindent += " " @@ -524,7 +526,7 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas server.write(writeindent + "if "+ stream["measurement"] + "time == 0:\n") writeindent += " " server.write(writeindent + "puffer = await " + valuename + ".get_value()\n") - server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + stream["measurement"] + " value: \" + str(puffer))\n") + server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + stream["measurement"] + " value: \" + str(puffer))\n\n") writeindent = "" for i in range(indent): writeindent += " "