Python OPC UA客户端 - 使用BrowseName写入变量

3

我找不到使用BrowseName给变量赋值的正确语法。我正在使用'flag1'布尔变量进行测试,因为它更容易调试。但我的目标是能够写入所有变量,包括数组。

如果我尝试使用索引号,它可以正常工作。

import pyOPCClient as opc

client = opc.opcConnect('192.168.5.10')

opc.write_value_bool(client, 'ns=4;s="opcData"."flag1"', True)

client.disconnect()

这是我的写布尔值的函数

##### Function to WRITE a Boolean into Bool Object Variable - Requires Object Name #####
def write_value_bool(client, node_id, value):
    client_node = client.get_node(node_id)  # get node
    client_node_value = value
    client_node_dv = ua.DataValue(ua.Variant(client_node_value, ua.VariantType.Boolean))
    client_node.set_value(client_node_dv)
    print("Value of : " + str(client_node) + ' : ' + str(client_node_value))

我正在遇到这个错误:
PS C:\Users\ALEMAC\Documents\Python Scripts> & C:/ProgramData/Anaconda3/python.exe "c:/Users/ALEMAC/Documents/Python Scripts/opctest.py"
Requested session timeout to be 3600000ms, got 30000ms instead
Traceback (most recent call last):
  File "c:\Users\ALEMAC\Documents\Python Scripts\opctest.py", line 5, in <module>
    opc.write_value_bool(client, 'ns=4;s="opcData"."flag1"', True)
  File "c:\Users\ALEMAC\Documents\Python Scripts\pyOPCClient.py", line 49, in write_value_bool
    client_node.set_value(client_node_dv)
  File "c:\Users\ALEMAC\Documents\Python Scripts\opcua\common\node.py", line 217, in set_value
    self.set_attribute(ua.AttributeIds.Value, datavalue)
  File "c:\Users\ALEMAC\Documents\Python Scripts\opcua\common\node.py", line 263, in set_attribute
    result[0].check()
  File "c:\Users\ALEMAC\Documents\Python Scripts\opcua\ua\uatypes.py", line 218, in check
    raise UaStatusCodeError(self.value)
opcua.ua.uaerrors._auto.BadNodeIdUnknown: "The node id refers to a node that does not exist in the server address space."(BadNodeIdUnknown)

TIA Portal V17 OPC UA - S7-1212

UA Expert Client


你的写入函数的输入参数是nodeid而不是browsename。请使用ns=4;i=20。 - SFriedl
谢谢您的回复!但我的目标是使用名称而不是索引...类似于“opcData”。“flag1”,而不是索引号。 - AlexMacabu
3个回答

3
我看到您使用了pyOPCClient包。我不确定这个包是否还在维护(最后更新日期:2014-01-09,请参见此处)。
您可以切换到opcua-asyncio,它可以通过浏览服务来访问节点,如下所示:
myvar = await client.nodes.root.get_child(["0:Objects",..., "4:flag1"])

这里是完整的示例,点击此处查看。


非常感谢您的建议!我知道这个模块,一旦我得到SiOME将标识符从NUMERIC更改为STRING,我会尽快尝试它。 - AlexMacabu
再次感谢!我尝试了上面的例子,但是我得到了奇怪的读数:<coroutine object Client.read_values at 0x0000010DF74F5DC0>。 - AlexMacabu
没有错误信息,它正在工作,读取信息,但显然数据需要以某种方式进行转换。 - AlexMacabu
也许这与此处的问题相同:https://dev59.com/rH4QtIcB2Jgan1znw-uf#75243577 - SFriedl
非常感谢您的努力!我通过参考以下教程,将NodeID类型从NUMERIC更改为STRING来解决了这个问题:https://support.industry.siemens.com/cs/document/109793221/how-do-you-change-the-node-id-identifier-type-of-the-nodes-in-the-s7-1200-opc-ua-server-from-numeric-to-string-?dti=0&dl=en&lc=nl-NL如果您通过SiOME添加服务器接口而不是在TIA Portal中添加,则可以轻松解决!现在我只需要弄清楚如何编写用户创建的数据类型! - AlexMacabu
显示剩余2条评论

1

你正在使用NodeId和BrowseName混合。只保留NodeId节点即可。

opc.write_value_bool(client, 'ns=4;i=20', True)

要编写其他数据点的“args”,您还需要找到它们的NodeId。

您可以使用OPC UA服务浏览器进行查找。


谢谢你的回复,Camille!但我的目标实际上是使用名称而不是索引。我记得在另一个PLC上使用过这种语法('ns=#;s="xxxx"'),并且可以正常工作。但我想不出为什么... - AlexMacabu

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接