|
@@ -1,58 +1,63 @@
|
|
|
#!/usr/bin/env python3
|
|
|
import redis
|
|
|
import asyncio
|
|
|
+import tracemalloc
|
|
|
|
|
|
from asyncua import Client
|
|
|
from datetime import datetime
|
|
|
|
|
|
opc_server_url = "opc.tcp://192.168.10.133:49320" # OPC UA服务器的URL
|
|
|
redis_ip = '127.0.0.1'
|
|
|
+tracemalloc.start()
|
|
|
|
|
|
+point_arr = [f"OPC.电液控.支架集.{num:03d}.立柱压力.前柱压力" for num in range(1, 138)]
|
|
|
|
|
|
-def get_point_arr():
|
|
|
- for i in range(137):
|
|
|
- three_digit_numbers = [f"OPC.电液控.支架集.{num:03d}.立柱压力.前柱压力" for num in range(1, 138)]
|
|
|
- return three_digit_numbers
|
|
|
|
|
|
+async def connect_and_read_opcua_data():
|
|
|
+ ns = 2
|
|
|
+ result_arr = {}
|
|
|
+ try:
|
|
|
+ async with Client(url=opc_server_url, timeout=1) as client:
|
|
|
+ await client.connect()
|
|
|
|
|
|
-# async def connect_and_read_opcua_data():
|
|
|
-#
|
|
|
-# async with Client(url=opc_server_url) as client:
|
|
|
-# # 连接到服务器
|
|
|
-# await client.connect()
|
|
|
-#
|
|
|
-# # 读取节点的值
|
|
|
-# node = await client.nodes.root.get_child(get_point_arr()) # 替换成你要读取的节点路径
|
|
|
-# value = await node.read_value()
|
|
|
-#
|
|
|
-# print("Node Value:", value)
|
|
|
+ node = await client.nodes.root.get_children() # 获取所有子节点
|
|
|
+ data_arr = [node.display_name.Text for node in node]
|
|
|
|
|
|
-async def get_opc_data():
|
|
|
- ns = 2
|
|
|
- opc_point_arr = get_point_arr()
|
|
|
-
|
|
|
- # redis
|
|
|
- pool = redis.ConnectionPool(host=redis_ip, password='')
|
|
|
- redis_conn = redis.Redis(connection_pool=pool)
|
|
|
-
|
|
|
- async with Client(url=opc_server_url) as client:
|
|
|
- i = 0
|
|
|
- result_arr = {}
|
|
|
- print(datetime.now().strftime('Start_time:%Y-%m-%d %H:%M:%S.%f'))
|
|
|
- for i in range(len(opc_point_arr)):
|
|
|
- try:
|
|
|
- node = f"ns={ns};s={opc_point_arr[i]}"
|
|
|
+ for data in data_arr:
|
|
|
+ node = f"ns={ns};s={data}"
|
|
|
tag = client.get_node(node)
|
|
|
value = await tag.read_value()
|
|
|
- # redis值
|
|
|
- redis_conn.set(str(opc_point_arr[i]), str(value))
|
|
|
- arr_key = node.split("=")
|
|
|
- result_arr[arr_key[2]] = value
|
|
|
- finally:
|
|
|
- continue
|
|
|
|
|
|
- return result_arr
|
|
|
+ # 异步存储到 Redis 中,需要使用异步的 Redis 客户端库
|
|
|
+ # aioredis 或者其他异步库
|
|
|
+ # redis_conn = await aioredis.create_redis_pool(('localhost', 6379))
|
|
|
+ # await redis_conn.set(str(data), str(value))
|
|
|
+ # await redis_conn.close()
|
|
|
+
|
|
|
+ # redis_conn.set(str(data_arr[i]), str(value))
|
|
|
+ # arr_key = node.split("=")
|
|
|
+ # result_arr[arr_key[2]] = value
|
|
|
+
|
|
|
+ result_arr[data] = value
|
|
|
+
|
|
|
+ return result_arr
|
|
|
+ except TimeoutError:
|
|
|
+ msg = "连接超时,请检查网络、服务器状态和连接参数。"
|
|
|
+ error = {
|
|
|
+ "code": -1,
|
|
|
+ "msg": msg
|
|
|
+ }
|
|
|
+ return error
|
|
|
+ except Exception as e:
|
|
|
+ msg = f"发生其他错误: {e}"
|
|
|
+ error = {
|
|
|
+ "code": -2,
|
|
|
+ "msg": msg
|
|
|
+ }
|
|
|
+ return error
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
- print(get_opc_data())
|
|
|
+ loop = asyncio.get_event_loop()
|
|
|
+ result = loop.run_until_complete(connect_and_read_opcua_data())
|
|
|
+ print(result)
|