如何让opcua在python中更加高效?

问题描述 投票:0回答:1

我目前正在编写一个 python skript,它通过 OPC UA 与 PLC 交互。

与OPC UA的通信似乎很慢。 我使用

time.perf_counter()
测量了向 PLC 写入 5 个值的时间,结果为 20 毫秒。

最终我尝试在一个周期内写入/读取最多 100 个变量。 这将导致 2 秒的循环时间。

PLC通过交换机与PC机连接。

我测试的5个变量: _node 是 Node 对象; 状态字为ushort(十六进制); 其他人都是int

opc.set_value(self.statusword_node,  get_statusnumber(self.statusword))
opc.set_value(self.actualspeed_node, self.actualspeed)
opc.set_value(self.errorcode_node,   self.errorcode)
opc.set_value(self.motorcurrent_node,self.motorcurrent)
opc.set_value(self.motortorque_node, self.motortorque)

opc 是我的 OpcClient 类中的一个对象。 set_value 是以下函数:

def set_value(node: Node, value) -> None:
    '''sets value to node object'''
    node.set_value(get_uadatatype(value))

函数 get_uadatatype() 以 uadatatype 形式返回值:

def get_uadatatype(value) -> ua.DataValue:
    '''checks the type of value and converts it into a ua.DataValue type'''
    if isinstance(value, bool):
        return ua.DataValue(ua.Variant(value, ua.VariantType.Boolean))

    elif isinstance(value, int) or isinstance(value, np.uint16):
        return ua.DataValue(ua.Variant(value, ua.VariantType.Int16))

    elif isinstance(value, float):
        return ua.DataValue(ua.Variant(value, ua.VariantType.Float))

    else:
        loginfo(f"Please import convert function for {type(value)}")
        raise ValueError

程序的哪一部分会减慢速度? 或者使用 opc 更快地写入值是不可能的吗?

感谢您的帮助:)

python plc opc-ua opc
1个回答
0
投票

让你变慢的是网络。每个 set_value 都会与服务器进行网络请求/响应。

为了加快速度,您需要进行批量写入:

nodes = [ 
    self.statusword_node,
    self.actualspeed_node,
    ...
]
values = [
    get_statusnumber(self.statusword),
    self.actualspeed,
    ...
]

opc.set_values(nodes, values)
© www.soinside.com 2019 - 2024. All rights reserved.