使用Python opcua-asyncio - BadNoMatch从PLC读取变量值:“请求的操作没有要返回的匹配项,”

aelbi1ox  于 2022-12-30  发布在  Python
关注(0)|答案(1)|浏览(379)

编辑以更正一些拼写错误:大家好,我是opcua-asyncio软件包的新手,所以如果我错过了一些非常明显的东西,请耐心等待,我正在尝试找出如何从Python连接到Siemens S7 1200 CPU 1212 C固件版本14 PLC(3.11)并读取一些变量值。很抱歉,我无法找到一种方法,以支持我的情况与一个可复制的例子,因为它是内在连接到测试PLC I'如果您能提出一种方法使其可重现,我将相应地修改答案。我的测试PLC上的结构在图片中详细说明,我可以通过不同的客户端访问它,t1到t19的变量是我的目标。[PLC Structure][1]我浏览了文档(尤其是client minimal example)和一些stackoverflow答案,并编写了以下代码

# modules
import asyncio
from asyncua import Client

# url and namespace
url = foo bar # the plc location on the network
namespace = "OPC-UA:PLC_1"
t2 =[]

#  I can find the objects inside the node
async with Client(url=url) as client:
    # Find the namespace index
    nsidx = await client.get_namespace_index("urn:OPC-UA:PLC_1")
    print(nsidx)
    root = client.nodes.root
    print("Root node is: ", root)
    objects = client.nodes.objects
    print("Objects node is: ", objects) 

# I can’t find my variables
    var = await client.nodes.root.get_child(
        ["0:Objects", "3:ServerInterfaces", "0:Face"])
    print("Var is:  ", var)
    t2 = await var.get_children_descriptions()
    print(t2)

根据我对OPC-UA:PLC_1命名空间中结构的理解,我应该找到一个“Objects”节点对象,其中列出了一个“ServerInterfaces”节点对象,其中列出了一个“Face”节点对象,其中列出了从t1到t19的变量。但是,如果我要求“Objects”通过get_children_descriptions()描述查尔兹,我可以看到ServerInterfaces节点对象,但此Serverinterfaces似乎命名为“Face”。
如果我要求“脸”的孩子,我会收到一个BadNoMatch错误。任何帮助我指出正确的方向将不胜感激。谢谢!

[1]: https://i.stack.imgur.com/QyQCJ.png
tv6aics1

tv6aics11#

我认为Face的Browsename名称空间索引是错误的。索引0用于基本节点集。您可以使用其他UA客户端(如UAExpert)检查正确的索引(此处您需要查看属性窗口,而不是地址空间窗口(不显示名称空间索引))。
如果在面“OPC-UA:PLC_1”中定义了面,则该行应为:

var = await client.nodes.root.get_child(
        ["0:Objects", "3:ServerInterfaces", "3:Face"])

相关问题