freeopcua调用方法输入参数| Python解析数组到输入列表
列表为了测试这个,你将需要freeopcua库。 我想向用户提供服务器上可用方法的列表。用户可以检测哪些方法存在。 (通过枚举)freeopcua调用方法输入参数| Python解析数组到输入列表
所有这些函数都有可变数量的输入参数和输出参数。
现在freeopcua你叫喜欢
node.call_method("2:myMethod1", 1,2,3,4)
的方法。然而我有什么可以为[1,2,3,4]。 (这是用户输入我得到) 会有解析这个方法,因此它适合myMethod参数?
最少的代码运行的问题(不是我的代码,但它会给我想要去的想法:
myServer.py:(只需要有方法没有问题,在这里)
from opcua import Server, ua, uamethod
from enum import Enum
class methods(Enum):
add = "add"
multi = "more"
person = "notInt"
class myServer(Server):
def __init__(self):
Server.__init__(self)
self.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
self.set_server_name("FreeOpcUa Example Server")
uri = "http://examples.freeopcua.github.io"
self.idx = self.register_namespace(uri)
# Automatically creates server methods of the methods I promise to offer
for mymethod in methods:
args = self.methodCreator(mymethod)
args[1]
self.nodes.objects.add_method(args[0], args[1], args[2], args[3], args[4])
self.start()
def methodCreator(self, method_type):
inargs = None
outargs = None
method = None
if method_type == methods.add:
inargs = []
inarg = ua.Argument()
inarg.Name = "first_number"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "second_number"
inargs.append(inarg)
method = self.multi
return [2, method_type.value, method, inargs, outargs]
elif method_type == methods.multi:
inargs = []
inarg = ua.Argument()
inarg.Name = "first_number"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "second_number"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "third_number"
inargs.append(inarg)
method = self.add
return [2, method_type.value, method, inargs, outargs]
elif method_type == methods.person:
inargs = []
inarg = ua.Argument()
inarg.Name = "Name"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "Age"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "Surname"
inargs.append(inarg)
inarg = ua.Argument()
inarg.Name = "Job"
inargs.append(inarg)
method = self.person
return [2, method_type.value, method, inargs, outargs]
@uamethod
def add(self, parent, x, y):
print(x+y)
@uamethod
def multi(self, parentm, x, y, z):
print(x*y*z)
@uamethod
def person(self, parent, name, age, surname, job):
print("I'm %s %s I'm %s years old and I do %s" % (name, surname, age, job))
现在文件它是所有关于:
myClient.py
from stack.server import myServer, methods
from opcua import Client
class myClient(Client):
def call_functions(self):
print("Implemented methods:")
values = []
for method in methods:
print(method.value)
values.append(method.value)
#In my real code I check input but here I'll trust the user
method = input("Select a method please: \n")
objects = self.nodes.objects
inarguments = objects.get_child(["2:" + method, "0:InputArguments"]).get_value()
inargs = []
for argument in inarguments:
inargs.append(input("%s: " % argument.Name))
# I disabled some methods to make sure I just need to show one case
if method == 'notInt':
print("Desired")
objects.call_method("2:" + method, inargs[0], inargs[1], inargs[2], inargs[3])
print("error")
objects.call_method("2:" + method, inargs) # This is the line that wont work
server = myServer()
with myClient("opc.tcp://localhost:4840/freeopcua/server/") as client:
client.call_functions()
server.stop()
所以,当我要调用的方法一般这样的:
objects.call_method("2:" + method, inargs)
这对于“notInt”将有所需的输出,如果我做的:
objects.call_method("2:" + method, inargs[0], inargs[1], inargs[2], inargs[3])
是否有办法蟒蛇得到这个从数组解析到输入参数列表分隔,?所以我可以保留我的通用方法来调用每个方法?或在freeopcua是那里得到所需的方式影响(记住,我使用的参数名,要求他输入用户所以才使得它需要一个列表作为输入不会是一个sollution)
我已经查了一下。昨天在与一些朋友的会议上,我讨论了这个问题。他们提出了一个关于*args的观点,并且我应该调查该路径是否有效。它确实如此。为了解决我的问题,我只需要在我的客户端响应列表的前面添加一个*,就像在共享链接中承诺的那样,将它解包并将其作为所有单个参数而不是1个列表对象发送到服务器。我的搜索关键字有一天是错误的。通过只是在做这在德myClient.py现在
from stack.server import myServer, methods
from opcua import Client
class myClient(Client):
def call_functions(self):
print("Implemented methods:")
values = []
for method in methods:
print(method.value)
values.append(method.value)
#In my real code I check input but here I'll trust the user
method = input("Select a method please: \n")
objects = self.nodes.objects
inarguments = objects.get_child(["2:" + method, "0:InputArguments"]).get_value()
inargs = []
for argument in inarguments:
inargs.append(input("%s: " % argument.Name))
# I disabled some methods to make sure I just need to show one case
if method == 'notInt':
print("Desired")
objects.call_method("2:" + method, inargs[0], inargs[1], inargs[2], inargs[3])
print("error")
objects.call_method("2:" + method, *inargs) # This will now work
server = myServer()
with myClient("opc.tcp://localhost:4840/freeopcua/server/") as client:
client.call_functions()
server.stop()
所有我需要做的是去除枚举所以客户要求这对服务器,然后我有一个客户端,是通用于任何功能我想补充无论如何解决到我的opcua服务器,我的客户端代码将能够询问哪些是可用的,选择一个并请求参数而不需要额外的代码。得爱蟒蛇!
主要是这样,我可以分发一个客户端,甚至认为服务器可以添加功能,而无需客户端更新 –
它主要是关于代码收集。是的客户端PC将需要更新的枚举。然而在我的真实项目中,我制作了一个模块,这些模块可以承担所有这些方法的功能,如果客户端完全独立于此对象而不是Enum –