Skip to content
Snippets Groups Projects
Commit d68f28dd authored by Susanna Weber's avatar Susanna Weber
Browse files

functions can be dynamically generated, some server issues were fixed

parent fb53408c
No related branches found
No related tags found
No related merge requests found
...@@ -108,6 +108,16 @@ def changerange(string): ...@@ -108,6 +108,16 @@ def changerange(string):
print(string) print(string)
def getobjnames(argarray):
returnarr = []
if len(argarray) > 0:
for i in argarray:
name = (i["name"].lower()).replace(" ", "")
returnarr.append(name)
return returnarr
else:
return None
def main(): def main():
try: try:
JSON_MODEL = sys.argv[1][:-5] JSON_MODEL = sys.argv[1][:-5]
...@@ -159,6 +169,8 @@ def main(): ...@@ -159,6 +169,8 @@ def main():
for i in functions: for i in functions:
obj = i obj = i
# del obj["value"] # del obj["value"]
obj["inargsnames"] = getobjnames(obj["arguments"])
obj["outargsnames"] = getobjnames(obj["returns"])
obj["inargsdatatypes"] = getdatatypes(obj["arguments"]) obj["inargsdatatypes"] = getdatatypes(obj["arguments"])
obj["outargsdatatypes"] = getdatatypes(obj["returns"]) obj["outargsdatatypes"] = getdatatypes(obj["returns"])
del obj["uuid"] del obj["uuid"]
...@@ -171,7 +183,7 @@ def main(): ...@@ -171,7 +183,7 @@ def main():
print(functionobj) print(functionobj)
print(parameterobj) print(parameterobj)
#exec(open("writefile.py").read()) #exec(open("writefile.py").read())
wf.write(measurementobj, parameterobj) wf.write(measurementobj, parameterobj, functionobj)
......
import jsonparse import jsonparse
import os import os
def defFunction(functionname, file, indent, contents = None): def defFunction(functionname, file, indent, inargs):
writeindent = "" writeindent = ""
for i in range(indent): for i in range(indent):
writeindent = writeindent + "\t" writeindent = writeindent + " "
file.write(indent + "async def " + functionname + ":") 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("):\n")
writeindent = writeindent + " "
file.write(writeindent + """#ToDo: Write an algorithm that fits the description of the function.
pass
""")
def getVariantType(datatype):
varianttype = "ua.VariantType.Int64"
if datatype == "float" or datatype == "double":
varianttype = "ua.VariantType.Double"
elif datatype == "Boolean":
varianttype = "ua.VariantType.Boolean"
return varianttype
def write(measurementobj, parameterobj): def write(measurementobj, parameterobj, functionobj):
if os.path.exists("opcua-server.py"): if os.path.exists("opcua-server.py"):
os.remove("opcua-server.py") os.remove("opcua-server.py")
server = open("opcua-server.py", "a") server = open("opcua-server.py", "a")
...@@ -51,19 +69,17 @@ _logger = logging.getLogger('asyncua') ...@@ -51,19 +69,17 @@ _logger = logging.getLogger('asyncua')
server.write("\n" + writeindent + "# creating all measurements with their properterties\n") server.write("\n" + writeindent + "# creating all measurements with their properterties\n")
measurementdict = {}
for i in measurementobj: for i in measurementobj:
varianttype = "ua.VariantType.Int64" varianttype = getVariantType(i.datatype)
if i.datatype == "float" or i.datatype == "double":
varianttype = "ua.VariantType.Double"
elif i.datatype == "Boolean":
varianttype = "ua.VariantType.Boolean"
datatype = "measurementtype.nodeid" datatype = "measurementtype.nodeid"
varname = ((i.name).lower()).replace(" ", "") + "var" 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 myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\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 i.range is not None and i.range is not [None, None]:
rangename = "rangeprop" 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 " + 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") server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
if i.unit is not None: if i.unit is not None:
unitname = "unitprop" unitname = "unitprop"
...@@ -75,19 +91,17 @@ _logger = logging.getLogger('asyncua') ...@@ -75,19 +91,17 @@ _logger = logging.getLogger('asyncua')
server.write("\n" + writeindent + "#creating all parameters with their properties\n") server.write("\n" + writeindent + "#creating all parameters with their properties\n")
parameterdict = {}
for i in parameterobj: for i in parameterobj:
varianttype = "ua.VariantType.Int64" varianttype = getVariantType(i.datatype)
if i.datatype == "float" or i.datatype == "double":
varianttype = "ua.VariantType.Double"
elif i.datatype == "Boolean":
varianttype = "ua.VariantType.Boolean"
datatype = "parametertype.nodeid" datatype = "parametertype.nodeid"
varname = ((i.name).lower()).replace(" ", "") + "var" 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 myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\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 i.range is not None and i.range is not [None, None]:
rangename = "rangeprop" 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 " + 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") server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n")
if i.unit is not None: if i.unit is not None:
unitname = "unitprop" unitname = "unitprop"
...@@ -97,6 +111,23 @@ _logger = logging.getLogger('asyncua') ...@@ -97,6 +111,23 @@ _logger = logging.getLogger('asyncua')
server.write(writeindent + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") server.write(writeindent + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
server.write(writeindent + "await description.set_modelling_rule(True)\n\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")
server.write(writeindent + "#adding functions to our robot\n")
for i in functionobj:
functionname = (i.name.lower()).replace(" ", "")
defFunction(functionname, server, indent, i.inargsnames)
server.write("\n")
inargslist = []
if i.inargsdatatypes != 0:
for j in i.inargsdatatypes:
inargslist.append(getVariantType(j))
outargslist = []
if i.outargsdatatypes != None:
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")
server.write(""" server.write("""
async with server: async with server:
...@@ -105,7 +136,7 @@ _logger = logging.getLogger('asyncua') ...@@ -105,7 +136,7 @@ _logger = logging.getLogger('asyncua')
while True: while True:
await asyncio.sleep(1) await asyncio.sleep(1)
if __name__ == 'main': if __name__ == '__main__':
asyncio.run(main())""") asyncio.run(main())""")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment