q пре 1 година
родитељ
комит
fd87f99f51
1 измењених фајлова са 43 додато и 38 уклоњено
  1. 43 38
      jjq_support_1.py

+ 43 - 38
jjq_support_1.py

@@ -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)