我目前正在编写一个 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 更快地写入值是不可能的吗?
感谢您的帮助:)
让你变慢的是网络。每个 set_value 都会与服务器进行网络请求/响应。
为了加快速度,您需要进行批量写入:
nodes = [
self.statusword_node,
self.actualspeed_node,
...
]
values = [
get_statusnumber(self.statusword),
self.actualspeed,
...
]
opc.set_values(nodes, values)