freeopcua调用方法输入参数| Python解析数组到输入列表

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)

+0

主要是这样,我可以分发一个客户端,甚至认为服务器可以添加功能,而无需客户端更新 –

+0

它主要是关于代码收集。是的客户端PC将需要更新的枚举。然而在我的真实项目中,我制作了一个模块,这些模块可以承担所有这些方法的功能,如果客户端完全独立于此对象而不是Enum –

我已经查了一下。昨天在与一些朋友的会议上,我讨论了这个问题。他们提出了一个关于*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服务器,我的客户端代码将能够询问哪些是可用的,选择一个并请求参数而不需要额外的代码。得爱蟒蛇!