diff --git a/jsonparse.py b/jsonparse.py index 8027d92d2aef3300892e47d3ec9081ead120aec6..bb7e5a36b024b6c2811990a8953c09d5d935a4fb 100644 --- a/jsonparse.py +++ b/jsonparse.py @@ -118,6 +118,63 @@ def getobjnames(argarray): else: return None + +def createcomponent(jsonobj, iscomponent): + measurements = jsonobj["measurements"] + measurementobj = [] + if len(measurements) > 0: + + for i in measurements: + obj = i + # del obj["value"] + del obj["uuid"] + dimensionchange(obj) + # if i["range"]: + changerange(obj) + obj = json.dumps(obj) + measurementobji = json.loads(obj, object_hook=measurementJsonDecod) + measurementobj.append(measurementobji) + + print(measurementobj) + parameters = jsonobj["parameters"] + parameterobj = [] + if len(parameters) > 0: + + for i in parameters: + obj = i + # del obj["value"] + del obj["uuid"] + dimensionchange(obj) + if i["range"]: + changerange(obj) + obj = json.dumps(obj) + parameterobji = json.loads(obj, object_hook=parameterJsonDecod) + parameterobj.append(parameterobji) + + functions = jsonobj["functions"] + functionobj = [] + if len(functions) > 0: + + for i in functions: + obj = i + # del obj["value"] + obj["inargsnames"] = getobjnames(obj["arguments"]) + obj["outargsnames"] = getobjnames(obj["returns"]) + obj["inargsdatatypes"] = getdatatypes(obj["arguments"]) + obj["outargsdatatypes"] = getdatatypes(obj["returns"]) + del obj["uuid"] + del obj["arguments"] + del obj["returns"] + obj = json.dumps(obj) + functionobji = json.loads(obj, object_hook=functionJsonDecod) + functionobj.append(functionobji) + + print(functionobj) + print(parameterobj) + # exec(open("writefile.py").read()) + wf.writeinserver(jsonobj["name"], jsonobj["description"], measurementobj, parameterobj, functionobj, iscomponent) + + def main(): try: JSON_MODEL = sys.argv[1][:-5] @@ -131,59 +188,13 @@ def main(): #robot = json.dumps(file.read()) robotload = json.loads(file.read()) - measurements = robotload["measurements"] - - if len(measurements) > 0: - measurementobj = [] - for i in measurements: - obj = i - #del obj["value"] - del obj["uuid"] - dimensionchange(obj) - #if i["range"]: - changerange(obj) - obj = json.dumps(obj) - measurementobji = json.loads(obj, object_hook=measurementJsonDecod) - measurementobj.append(measurementobji) - - print(measurementobj) - parameters = robotload["parameters"] - - if len(parameters) > 0: - parameterobj = [] - for i in parameters: - obj = i - # del obj["value"] - del obj["uuid"] - dimensionchange(obj) - if i["range"]: - changerange(obj) - obj = json.dumps(obj) - parameterobji = json.loads(obj, object_hook=parameterJsonDecod) - parameterobj.append(parameterobji) - - functions = robotload["functions"] - - if len(functions) > 0: - functionobj = [] - for i in functions: - obj = i - # del obj["value"] - obj["inargsnames"] = getobjnames(obj["arguments"]) - obj["outargsnames"] = getobjnames(obj["returns"]) - obj["inargsdatatypes"] = getdatatypes(obj["arguments"]) - obj["outargsdatatypes"] = getdatatypes(obj["returns"]) - del obj["uuid"] - del obj["arguments"] - del obj["returns"] - obj = json.dumps(obj) - functionobji = json.loads(obj, object_hook=functionJsonDecod) - functionobj.append(functionobji) - - print(functionobj) - print(parameterobj) - #exec(open("writefile.py").read()) - wf.write(measurementobj, parameterobj, functionobj) + wf.writebeginning() + createcomponent(robotload, False) + for i in robotload["components"]: + createcomponent(i, True) + wf.writend() + + diff --git a/writefile.py b/writefile.py index cc0ac5ce3f00af68d663eb30c54318590b6ed93f..634cf6ea189e760e5c281e42e9633be78e0eb419 100644 --- a/writefile.py +++ b/writefile.py @@ -5,12 +5,14 @@ def defFunction(functionname, file, indent, inargs): writeindent = "" for i in range(indent): writeindent = writeindent + " " - file.write(writeindent + "async def " + functionname + "(parent, ") - for i in range (len(inargs)): - if i < (len(inargs) - 1): - file.write(inargs[i] + ", ") - else: - file.write(inargs[i]) + file.write(writeindent + "async def " + functionname + "(parent") + if inargs is not None: + file.write(", ") + for i in range (len(inargs)): + if i < (len(inargs) - 1): + file.write(inargs[i] + ", ") + else: + file.write(inargs[i]) file.write("):\n") writeindent = writeindent + " " file.write(writeindent + """#ToDo: Write an algorithm that fits the description of the function. @@ -24,48 +26,16 @@ def getVariantType(datatype): elif datatype == "Boolean": varianttype = "ua.VariantType.Boolean" return varianttype - -def write(measurementobj, parameterobj, functionobj): - if os.path.exists("opcua-server.py"): - os.remove("opcua-server.py") +def writeinserver(objname, objdescription, measurementobj, parameterobj, functionobj, iscomponent): server = open("opcua-server.py", "a") - server.write("""import logging -import asyncio - -from asyncua import ua, Server -from asyncua.common.methods import uamethod -from asyncua.common.structures104 import new_struct, new_enum, new_struct_field -from asyncua.common import node - -logging.basicConfig(level=logging.INFO) -_logger = logging.getLogger('asyncua') -""") - - server.write("\nasync def main():") - #äinten = "\tab" - server.write(""" - # setup our server - server = Server() - await server.init() - server.set_endpoint('opc.tcp://0.0.0.0:4840/freeopcua/server/') - - # setup our own namespace, not really necessary but should as spec - uri = 'http://examples.freeopcua.github.io/' - idx = await server.register_namespace(uri) - #id of rangetype - rangeid = await server.nodes.base_data_type.get_child(["0:Structure", "0:Range"]) - - #creating the objecttype - myobjtype = await server.nodes.base_object_type.add_object_type(idx, "Robot") - - #creating dataypes for parameters and measurements - measurementtype = await server.nodes.base_data_type.add_data_type(idx, "Measurement") - parametertype = await server.nodes.base_data_type.add_data_type(idx, "Parameter") -""") indent = 1 writeindent = "" for j in range(indent): writeindent = 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("\n" + writeindent + "# creating all measurements with their properterties\n") @@ -75,18 +45,23 @@ _logger = logging.getLogger('asyncua') datatype = "measurementtype.nodeid" varname = ((i.name).lower()).replace(" ", "") + "var" measurementdict[i.name] = varname - server.write(writeindent + varname + " = " + "await myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") + server.write(writeindent + varname + " = " + "await " + objtypename + ".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 is not [None, None]: + headnode = "" + if iscomponent: + headnode = objtypename + else: + headnode = varname + if i.range is not None and i.range is not "(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 + rangename + " = await " + headnode + ".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 is not None: + if i.unit != "UNITLESS": unitname = "unitprop" - server.write(writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") + server.write(writeindent + unitname + " = await " + headnode + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") - server.write(writeindent + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") + server.write(writeindent + "description = await " + headnode + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") server.write(writeindent + "await description.set_modelling_rule(True)\n\n") server.write("\n" + writeindent + "#creating all parameters with their properties\n") @@ -97,21 +72,30 @@ _logger = logging.getLogger('asyncua') datatype = "parametertype.nodeid" varname = ((i.name).lower()).replace(" ", "") + "var" parameterdict[i.name] = varname - server.write(writeindent + varname + " = " + "await myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") + server.write(writeindent + varname + " = " + "await " + objtypename + ".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 is not [None, None]: + if iscomponent: + headnode = objtypename + else: + headnode = varname + if i.range is not None and i.range is not (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 + rangename + " = await " + headnode + ".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 is not None: + if i.unit is not "UNITLESS": unitname = "unitprop" - server.write(writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") + server.write(writeindent + unitname + " = await " + headnode + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n") server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n") - server.write(writeindent + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") + server.write(writeindent + "description = await " + headnode + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") server.write(writeindent + "await description.set_modelling_rule(True)\n\n") - server.write(writeindent + "mobilerobot = await server.nodes.objects.add_object(idx, \"Mobile Robot \", myobjtype.nodeid)\n") + objnamevar = (objname.lower()).replace(" ", "") + if(not iscomponent): + server.write(writeindent + objnamevar + "= await server.nodes.objects.add_object(idx, \"" + objname + "\"," + objtypename + ".nodeid)\n") + else: + server.write(writeindent + "headnodeid = await server.nodes.objects.get_child([\"2:Mobile Robot\"])\n") + server.write(writeindent + objnamevar + "= await headnodeid.add_object(idx,\"" + objname + "\")\n") server.write(writeindent + "#adding functions to our robot\n") @@ -120,7 +104,7 @@ _logger = logging.getLogger('asyncua') defFunction(functionname, server, indent, i.inargsnames) server.write("\n") inargslist = [] - if i.inargsdatatypes != 0: + if i.inargsdatatypes != None: for j in i.inargsdatatypes: inargslist.append(getVariantType(j)) outargslist = [] @@ -128,14 +112,53 @@ _logger = logging.getLogger('asyncua') for j in i.outargsdataypes: inargslist.append(getVariantType(j)) server.write(writeindent + "await mobilerobot.add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n") +def writebeginning(): + if os.path.exists("opcua-server.py"): + os.remove("opcua-server.py") + server = open("opcua-server.py", "a") + server.write("""import logging +import asyncio + +from asyncua import ua, Server +from asyncua.common.methods import uamethod +from asyncua.common.structures104 import new_struct, new_enum, new_struct_field +from asyncua.common import node + +logging.basicConfig(level=logging.INFO) +_logger = logging.getLogger('asyncua') +""") + server.write("\nasync def main():") + #äinten = "\tab" + server.write(""" + # setup our server + server = Server() + await server.init() + server.set_endpoint('opc.tcp://0.0.0.0:4840/freeopcua/server/') + + # setup our own namespace, not really necessary but should as spec + uri = 'http://examples.freeopcua.github.io/' + idx = await server.register_namespace(uri) + #id of rangetype + rangeid = await server.nodes.base_data_type.get_child(["0:Structure", "0:Range"]) + + + + #creating dataypes for parameters and measurements + 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 writend(): + server = open("opcua-server.py", "a") server.write(""" async with server: print("Server is running!") - + while True: await asyncio.sleep(1) - + if __name__ == '__main__': asyncio.run(main())""")