Bläddra i källkod

隐藏输出信息1

psto 2 år sedan
förälder
incheckning
e5ed79f752
9 ändrade filer med 384 tillägg och 189 borttagningar
  1. 1 0
      .gitignore
  2. 61 0
      api_server.py
  3. 139 0
      config/jinjiaqu/array/support_arr.json
  4. 1 1
      config/jinjiaqu/support.json
  5. 83 0
      get_config.py
  6. 94 0
      get_opc_data.py
  7. 5 188
      main.py
  8. 0 0
      shell/first_run_linux.sh
  9. 0 0
      shell/first_run_windwos.bat

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 ./config/config.json
 /config/config.json
+main.py.bak

+ 61 - 0
api_server.py

@@ -0,0 +1,61 @@
+import asyncio
+import get_config
+
+from get_opc_data import get_opc_data, point_data_to_arr
+
+from flask import Flask, request, render_template
+
+app = Flask(__name__)
+
+
+# route
+@app.route("/", methods=['GET', 'POST'])
+@app.route("/get/", methods=['GET', 'POST'])
+def get():
+    try:
+        # 1、获取请求参数
+        # 矿名key
+        sys_key = request.values.get('sys_key')
+        # 自动化系统key
+        sys_name = request.values.get('sys_name')
+        # 2、参数判断
+        if sys_key is None or len(sys_key) == 0 or sys_name is None or len(sys_name) == 0:
+            return api_get_error("参数错误")
+
+    except BaseException as e:
+        print(f"异常,参数错误!")
+        return api_get_error(e)
+    # 3、开启服务
+    # 3.1 获取opc点位arr
+    opc_point_arr = get_config.get_opc_point_arr_conf(sys_key, sys_name)
+    # 3.2 根据点位获取数据
+    opc_sys_conf = get_config.get_opc_sys_conf(sys_key, sys_name)
+    opc_data = asyncio.run(get_opc_data(opc_sys_conf.opc_server_url, opc_point_arr))
+    # opc_data = get_opc_data(opc_sys_conf.opc_server_url, opc_point_arr)
+    # 3.3 数据处理
+    opc_json_data = get_config.get_opc_point_json_conf(sys_key, sys_name)
+    if opc_data is None or isinstance(opc_data, str):
+        return api_get_error("数据读取错误!请检查点位或服务配置!")
+    else:
+        json_data = point_data_to_arr(opc_json_data, opc_data)
+        # 数据处理
+        return json_data
+
+
+
+def api_get_error(msg):
+    return '{"code":-1, "msg":"' + msg + '"}'
+
+
+# 开启接口服务
+def run_api_server():
+    config = get_config.get_base_conf()
+    port = config.server_port
+    app.run(
+        host='0.0.0.0',
+        port=port
+    )
+
+
+if __name__ == "__main__":
+    run_api_server()

+ 139 - 0
config/jinjiaqu/array/support_arr.json

@@ -0,0 +1,139 @@
+[
+  "OPC.电液控.支架集.001.立柱压力.前柱压力",
+  "OPC.电液控.支架集.002.立柱压力.前柱压力",
+  "OPC.电液控.支架集.003.立柱压力.前柱压力",
+  "OPC.电液控.支架集.004.立柱压力.前柱压力",
+  "OPC.电液控.支架集.005.立柱压力.前柱压力",
+  "OPC.电液控.支架集.006.立柱压力.前柱压力",
+  "OPC.电液控.支架集.007.立柱压力.前柱压力",
+  "OPC.电液控.支架集.008.立柱压力.前柱压力",
+  "OPC.电液控.支架集.009.立柱压力.前柱压力",
+  "OPC.电液控.支架集.010.立柱压力.前柱压力",
+  "OPC.电液控.支架集.011.立柱压力.前柱压力",
+  "OPC.电液控.支架集.012.立柱压力.前柱压力",
+  "OPC.电液控.支架集.013.立柱压力.前柱压力",
+  "OPC.电液控.支架集.014.立柱压力.前柱压力",
+  "OPC.电液控.支架集.015.立柱压力.前柱压力",
+  "OPC.电液控.支架集.016.立柱压力.前柱压力",
+  "OPC.电液控.支架集.017.立柱压力.前柱压力",
+  "OPC.电液控.支架集.018.立柱压力.前柱压力",
+  "OPC.电液控.支架集.019.立柱压力.前柱压力",
+  "OPC.电液控.支架集.020.立柱压力.前柱压力",
+  "OPC.电液控.支架集.021.立柱压力.前柱压力",
+  "OPC.电液控.支架集.022.立柱压力.前柱压力",
+  "OPC.电液控.支架集.023.立柱压力.前柱压力",
+  "OPC.电液控.支架集.024.立柱压力.前柱压力",
+  "OPC.电液控.支架集.025.立柱压力.前柱压力",
+  "OPC.电液控.支架集.026.立柱压力.前柱压力",
+  "OPC.电液控.支架集.027.立柱压力.前柱压力",
+  "OPC.电液控.支架集.028.立柱压力.前柱压力",
+  "OPC.电液控.支架集.029.立柱压力.前柱压力",
+  "OPC.电液控.支架集.030.立柱压力.前柱压力",
+  "OPC.电液控.支架集.031.立柱压力.前柱压力",
+  "OPC.电液控.支架集.032.立柱压力.前柱压力",
+  "OPC.电液控.支架集.033.立柱压力.前柱压力",
+  "OPC.电液控.支架集.034.立柱压力.前柱压力",
+  "OPC.电液控.支架集.035.立柱压力.前柱压力",
+  "OPC.电液控.支架集.036.立柱压力.前柱压力",
+  "OPC.电液控.支架集.037.立柱压力.前柱压力",
+  "OPC.电液控.支架集.038.立柱压力.前柱压力",
+  "OPC.电液控.支架集.039.立柱压力.前柱压力",
+  "OPC.电液控.支架集.040.立柱压力.前柱压力",
+  "OPC.电液控.支架集.041.立柱压力.前柱压力",
+  "OPC.电液控.支架集.042.立柱压力.前柱压力",
+  "OPC.电液控.支架集.043.立柱压力.前柱压力",
+  "OPC.电液控.支架集.044.立柱压力.前柱压力",
+  "OPC.电液控.支架集.045.立柱压力.前柱压力",
+  "OPC.电液控.支架集.046.立柱压力.前柱压力",
+  "OPC.电液控.支架集.047.立柱压力.前柱压力",
+  "OPC.电液控.支架集.048.立柱压力.前柱压力",
+  "OPC.电液控.支架集.049.立柱压力.前柱压力",
+  "OPC.电液控.支架集.050.立柱压力.前柱压力",
+  "OPC.电液控.支架集.051.立柱压力.前柱压力",
+  "OPC.电液控.支架集.052.立柱压力.前柱压力",
+  "OPC.电液控.支架集.053.立柱压力.前柱压力",
+  "OPC.电液控.支架集.054.立柱压力.前柱压力",
+  "OPC.电液控.支架集.055.立柱压力.前柱压力",
+  "OPC.电液控.支架集.056.立柱压力.前柱压力",
+  "OPC.电液控.支架集.057.立柱压力.前柱压力",
+  "OPC.电液控.支架集.058.立柱压力.前柱压力",
+  "OPC.电液控.支架集.059.立柱压力.前柱压力",
+  "OPC.电液控.支架集.060.立柱压力.前柱压力",
+  "OPC.电液控.支架集.061.立柱压力.前柱压力",
+  "OPC.电液控.支架集.062.立柱压力.前柱压力",
+  "OPC.电液控.支架集.063.立柱压力.前柱压力",
+  "OPC.电液控.支架集.064.立柱压力.前柱压力",
+  "OPC.电液控.支架集.065.立柱压力.前柱压力",
+  "OPC.电液控.支架集.066.立柱压力.前柱压力",
+  "OPC.电液控.支架集.067.立柱压力.前柱压力",
+  "OPC.电液控.支架集.068.立柱压力.前柱压力",
+  "OPC.电液控.支架集.069.立柱压力.前柱压力",
+  "OPC.电液控.支架集.070.立柱压力.前柱压力",
+  "OPC.电液控.支架集.071.立柱压力.前柱压力",
+  "OPC.电液控.支架集.072.立柱压力.前柱压力",
+  "OPC.电液控.支架集.073.立柱压力.前柱压力",
+  "OPC.电液控.支架集.074.立柱压力.前柱压力",
+  "OPC.电液控.支架集.075.立柱压力.前柱压力",
+  "OPC.电液控.支架集.076.立柱压力.前柱压力",
+  "OPC.电液控.支架集.077.立柱压力.前柱压力",
+  "OPC.电液控.支架集.078.立柱压力.前柱压力",
+  "OPC.电液控.支架集.079.立柱压力.前柱压力",
+  "OPC.电液控.支架集.080.立柱压力.前柱压力",
+  "OPC.电液控.支架集.081.立柱压力.前柱压力",
+  "OPC.电液控.支架集.082.立柱压力.前柱压力",
+  "OPC.电液控.支架集.083.立柱压力.前柱压力",
+  "OPC.电液控.支架集.084.立柱压力.前柱压力",
+  "OPC.电液控.支架集.085.立柱压力.前柱压力",
+  "OPC.电液控.支架集.086.立柱压力.前柱压力",
+  "OPC.电液控.支架集.087.立柱压力.前柱压力",
+  "OPC.电液控.支架集.088.立柱压力.前柱压力",
+  "OPC.电液控.支架集.089.立柱压力.前柱压力",
+  "OPC.电液控.支架集.090.立柱压力.前柱压力",
+  "OPC.电液控.支架集.091.立柱压力.前柱压力",
+  "OPC.电液控.支架集.092.立柱压力.前柱压力",
+  "OPC.电液控.支架集.093.立柱压力.前柱压力",
+  "OPC.电液控.支架集.094.立柱压力.前柱压力",
+  "OPC.电液控.支架集.095.立柱压力.前柱压力",
+  "OPC.电液控.支架集.096.立柱压力.前柱压力",
+  "OPC.电液控.支架集.097.立柱压力.前柱压力",
+  "OPC.电液控.支架集.098.立柱压力.前柱压力",
+  "OPC.电液控.支架集.099.立柱压力.前柱压力",
+  "OPC.电液控.支架集.100.立柱压力.前柱压力",
+  "OPC.电液控.支架集.101.立柱压力.前柱压力",
+  "OPC.电液控.支架集.102.立柱压力.前柱压力",
+  "OPC.电液控.支架集.103.立柱压力.前柱压力",
+  "OPC.电液控.支架集.104.立柱压力.前柱压力",
+  "OPC.电液控.支架集.105.立柱压力.前柱压力",
+  "OPC.电液控.支架集.106.立柱压力.前柱压力",
+  "OPC.电液控.支架集.107.立柱压力.前柱压力",
+  "OPC.电液控.支架集.108.立柱压力.前柱压力",
+  "OPC.电液控.支架集.109.立柱压力.前柱压力",
+  "OPC.电液控.支架集.110.立柱压力.前柱压力",
+  "OPC.电液控.支架集.111.立柱压力.前柱压力",
+  "OPC.电液控.支架集.112.立柱压力.前柱压力",
+  "OPC.电液控.支架集.113.立柱压力.前柱压力",
+  "OPC.电液控.支架集.114.立柱压力.前柱压力",
+  "OPC.电液控.支架集.115.立柱压力.前柱压力",
+  "OPC.电液控.支架集.116.立柱压力.前柱压力",
+  "OPC.电液控.支架集.117.立柱压力.前柱压力",
+  "OPC.电液控.支架集.118.立柱压力.前柱压力",
+  "OPC.电液控.支架集.119.立柱压力.前柱压力",
+  "OPC.电液控.支架集.120.立柱压力.前柱压力",
+  "OPC.电液控.支架集.121.立柱压力.前柱压力",
+  "OPC.电液控.支架集.122.立柱压力.前柱压力",
+  "OPC.电液控.支架集.123.立柱压力.前柱压力",
+  "OPC.电液控.支架集.124.立柱压力.前柱压力",
+  "OPC.电液控.支架集.125.立柱压力.前柱压力",
+  "OPC.电液控.支架集.126.立柱压力.前柱压力",
+  "OPC.电液控.支架集.127.立柱压力.前柱压力",
+  "OPC.电液控.支架集.128.立柱压力.前柱压力",
+  "OPC.电液控.支架集.129.立柱压力.前柱压力",
+  "OPC.电液控.支架集.130.立柱压力.前柱压力",
+  "OPC.电液控.支架集.131.立柱压力.前柱压力",
+  "OPC.电液控.支架集.132.立柱压力.前柱压力",
+  "OPC.电液控.支架集.133.立柱压力.前柱压力",
+  "OPC.电液控.支架集.134.立柱压力.前柱压力",
+  "OPC.电液控.支架集.135.立柱压力.前柱压力",
+  "OPC.电液控.支架集.136.立柱压力.前柱压力",
+  "OPC.电液控.支架集.137.立柱压力.前柱压力"
+]

+ 1 - 1
config/jinjiaqu/support.json

@@ -3,7 +3,7 @@
   "sys_name": "电液控系统",
   "sys_point": {
     "support": [
-            {
+      {
         "key": "OPC.电液控.支架集.001.立柱压力.前柱压力",
         "name":"1号立柱压力",
         "unit": "Mpa",

+ 83 - 0
get_config.py

@@ -0,0 +1,83 @@
+import json
+
+
+class modelOpcConf:
+    # OPC服务地址
+    opc_server_url = None
+    # 矿名id
+    sys_key = None
+    # 系统名
+    sys_name = None
+    # 接口配置文件名
+    file_name = None
+    # 接口配置路径
+    path = None
+    # 点位数组路径
+    # point_arr_path = None
+
+
+class modelBaseConf:
+    server_port = None
+
+
+def get_conf(file_name="config.json", file_path="./config"):
+    path = f"{file_path}/{file_name}"
+    try:
+        with open(path, "r", encoding="utf-8") as f:
+            content = json.load(f)
+            f.close()
+            return content
+
+    except BaseException as e:
+        print(e)
+        print(f"异常,配置文件读取错误!path:{path}")
+
+
+def get_base_conf():
+    model = modelBaseConf()
+    base_conf = get_conf()
+    model.server_port = base_conf['server_port']
+    return model
+
+
+def get_opc_sys_conf(sys_key, sys_name):
+    base_conf = get_conf()
+    conf_dict = base_conf['sys_conf'][sys_key][sys_name]
+    # 创建model
+    model = modelOpcConf()
+    # model赋值
+    model.opc_server_url = conf_dict['opc_server_url']
+    model.sys_key = conf_dict['sys_key']
+    model.sys_name = conf_dict['sys_name']
+    model.file_name = conf_dict['file_name']
+    model.path = conf_dict['path']
+
+    return model
+
+
+def get_opc_point_json_conf(sys_key, sys_name):
+    config = get_opc_sys_conf(sys_key, sys_name)
+    # 获取opc服务地址
+    sys_file_path = config.path
+    sys_file_name = config.file_name
+
+    point_conf = get_conf(sys_file_name, sys_file_path)
+
+    return point_conf
+
+
+def get_opc_point_arr_conf(sys_key, sys_name):
+    config = get_opc_sys_conf(sys_key, sys_name)
+    # 获取opc服务地址
+    arr_file_path = f"{config.path}/array"
+    arr_file_name = f"{config.sys_key}_arr.json"
+
+    point_conf_arr = get_conf(arr_file_name, arr_file_path)
+
+    return point_conf_arr
+
+
+if __name__ == "__main__":
+    sys_key = 'jinjiaqu'
+    sys_name = 'support'
+    point_arr = get_opc_point_arr_conf(sys_key, sys_name)

+ 94 - 0
get_opc_data.py

@@ -0,0 +1,94 @@
+import redis
+import logging
+from asyncua import Client
+from datetime import datetime
+from get_config import get_conf
+
+
+# 连接redis服务
+def get_redis_conn():
+    # 获取配置
+    config = get_conf()
+    # 创建redis对象
+    try:
+        redis_conf = config['redis_conf']
+        redis_ip = redis_conf['ip']
+        pool = redis.ConnectionPool(host=redis_ip, password='')
+        redis_conn = redis.Redis(connection_pool=pool)
+    except BaseException as e:
+        print(e)
+        print("异常,redis连接错误!")
+    return redis_conn
+
+
+# 根据服务、和点位获取OPC数据
+async def get_opc_data(sys_url, point_arr, ns=2):
+    if sys_url is None or point_arr is None:
+        return
+    # 获取配置
+    # config = get_conf()
+    # 获取redis
+    redis_conn = get_redis_conn()
+
+    # 连接opc服务
+    try:
+        print("正在连接OPCUA服务...")
+        async with Client(url=sys_url) as client:
+            i = 0
+            result_arr = {}
+            print(datetime.now().strftime('Start_time:%Y-%m-%d %H:%M:%S.%f'))
+            while i < len(point_arr):
+                try:
+                    node = f"ns={ns};s={point_arr[i]}"
+                    tag = client.get_node(node)
+                    value = await tag.read_value()
+                    # redis值
+                    redis_conn.set(str(node), str(value))
+                    arr_key = node.split("=")
+                    result_arr[arr_key[2]] = value
+                finally:
+                    i += 1
+                    continue
+            print(datetime.now().strftime('End_time:%Y-%m-%d %H:%M:%S.%f'))
+            return result_arr
+    except KeyError as e:
+        # logging.warning(e.args)
+        logging.warning("服务连接错误!")
+        return "服务连接错误!"
+    except BaseException as e:
+        print(e)
+        return "服务连接错误!"
+
+
+# 将点位值赋予json(递归,适配多级json)
+def point_data_to_arr(point_data, data_arr=[]):
+    # 未获取到值返回空数组
+    if len(data_arr) == 0:
+        return point_data
+
+    point_dict = {}
+    if isinstance(point_data, dict):
+        for key, val in point_data.items():
+            data = point_data[key]
+            if 'val' == key:
+                point_key = point_dict['key']
+                if point_key in data_arr:
+                    point_dict['val'] = data_arr[point_key]
+                else:
+                    point_dict['val'] = ""
+            elif isinstance(val, str):
+                point_dict[key] = point_data[key]
+            else:
+                test = point_data_to_arr(data, data_arr)
+                point_dict[key] = test
+    elif isinstance(point_data, list):
+        point_arr = []
+        for i in range(len(point_data)):
+            data = point_data[i]
+            data_dic = point_data_to_arr(data, data_arr)
+            point_arr.append(data_dic)
+            # point_arr[i] =
+        return point_arr
+
+    return point_dict
+

+ 5 - 188
main.py

@@ -1,193 +1,10 @@
-import os
-import re
-import json
-import redis
-import logging
-import asyncio
+import api_server
 
-from flask import Flask, request, render_template
-from asyncua import Client
-from datetime import datetime
 
-
-class SubHandler(object):
-    r = None
-    pool = None
-    config = None
-
-    def __init__(self):
-        try:
-            self.config = get_conf()
-            redis_conf = self.config['redis_conf']
-            ip = redis_conf['ip']
-            self.pool = redis.ConnectionPool(host=ip, password='')
-            self.r = redis.Redis(connection_pool=self.pool)
-        except Exception as e:
-            raise Exception("redis连接错误!")
-
-    async def datachange_notification(self, node, val, data):
-        print("Python: New data change event", node, val)
-
-    def event_notification(self, event):
-        print("Python: New event", event)
-
-
-app = Flask(__name__)
-
-
-# route
-@app.route("/get/", methods=['GET', 'POST'])
-def get():
-    # 矿名key
-    sys_key = request.values.get('sys_key')
-    # 自动化系统key
-    sys_name = request.values.get('sys_name')
-    # 参数判断
-    if sys_key is None or len(sys_key) == 0 or sys_name is None or len(sys_name) == 0:
-        return "参数错误"
-    # 获取程序配置
-    base_conf = get_conf()
-    # 获取opc服务地址
-    sys_url = base_conf['sys_conf'][sys_key][sys_name]['opc_server_url']
-
-    # 获取配置文件名
-    sys_file_path = base_conf['sys_conf'][sys_key][sys_name]['path']
-    sys_file_name = base_conf['sys_conf'][sys_key][sys_name]['file_name']
-    # 获取点位数组
-    point_conf = get_conf(sys_file_name, sys_file_path)
-    try:
-        # 取需要监听的点位key数组
-        point_arr = point_to_arr(point_conf)
-        # 根据服务地址获取Opc数据
-        data = asyncio.run(get_opc_data(sys_url, point_arr, 2))
-        # 根据获取值整理成json
-        dict_data = point_data_to_arr(point_conf, data)
-
-        # 显示请求地址IP
-        # print(f"接收到请求,来自{get_request_ip()} {sys_key} {sys_name}")
-
-        return dict_data
-
-    except Exception as e:
-        raise Exception("点位获取错误!")
-
-
-# 将点位整理数据,用于获取点位值
-def point_to_arr(point_data):
-    if isinstance(point_data, dict):
-        point_arr = []
-        for key, val in point_data.items():
-            data = point_data[key]
-            if 'key' in point_data.keys():
-                return point_data['key']
-            if isinstance(data, str):
-                continue
-        return point_to_arr(data)
-    elif isinstance(point_data, list):
-        point_arr = []
-        for i in range(len(point_data)):
-            data = point_to_arr(point_data[i])
-            point_arr.append(data)
-        return point_arr
-    else:
-        return
-
-
-# 将点位值赋予json(递归,适配多级json)
-def point_data_to_arr(point_data, data_arr=[]):
-    # 未获取到值返回空数组
-    if len(data_arr) == 0:
-        return point_data
-
-    point_dict = {}
-    if isinstance(point_data, dict):
-        for key, val in point_data.items():
-            data = point_data[key]
-            if 'val' == key:
-                point_key = point_dict['key']
-                if point_key in data_arr:
-                    point_dict['val'] = data_arr[point_key]
-                else:
-                    point_dict['val'] = ""
-            elif isinstance(val, str):
-                point_dict[key] = point_data[key]
-            else:
-                test = point_data_to_arr(data, data_arr)
-                point_dict[key] = test
-    elif isinstance(point_data, list):
-        point_arr = []
-        for i in range(len(point_data)):
-            data = point_data[i]
-            data_dic = point_data_to_arr(data, data_arr)
-            point_arr.append(data_dic)
-            # point_arr[i] =
-        return point_arr
-
-    return point_dict
-
-
-# 获取点位值
-async def get_opc_data(sys_url, point_arr, ns=2):
-    if sys_url is None or point_arr is None:
-        return
-    url = sys_url
-    async with Client(url=url) as client:
-        handler = SubHandler()
-        r = handler.r
-        i = 0
-        result_arr = {}
-        print(datetime.now().strftime('Start_time:%Y-%m-%d %H:%M:%S.%f'))
-        while i < len(point_arr):
-            node = f"ns={ns};s={point_arr[i]}"
-            tag = client.get_node(node)
-            try:
-                # 监听点位
-                await client.create_subscription(500, handler)
-            except Exception as e:
-                # print(e.args)
-                raise Exception("设置监听错误!")
-            try:
-                value = await tag.read_value()
-                # redis值
-                r.set(str(node), str(value))
-                # 获取点位key
-                arr_key = node.split("=")
-                result_arr[arr_key[2]] = value
-                # print(f"tag1 is: {tag} with value {value} ")
-                i += 1
-                if i == len(point_arr):
-                    print("Get Data Success")
-            finally:
-                # print(f"node={node} 点位值获取错误")
-                i += 1
-                continue
-        print(datetime.now().strftime('End_time:%Y-%m-%d %H:%M:%S.%f'))
-        return result_arr
-
-
-# 获取文件配置
-def get_conf(file_name="config.json", file_path="./config"):
-    path = f"{file_path}/{file_name}"
-    with open(path, "r", encoding="utf-8") as f:
-        content = json.load(f)
-        f.close()
-        return content
-
-
-# 获取请求Ip
-def get_request_ip():
-    return request.remote_addr
-
-
-# 返回错误信息
-def api_get_error(msg):
-    return '{"code":-1, "msg":"' + msg + '"}'
+def api_run():
+    # 开启接口服务
+    api_server.run_api_server()
 
 
 if __name__ == '__main__':
-    config = get_conf()
-    port = config['server_port']
-    app.run(
-        host='0.0.0.0',
-        port=config['server_port']
-    )
+    api_run()

first_run_linux.sh → shell/first_run_linux.sh


first_run_windwos.bat → shell/first_run_windwos.bat