Загрузка данных


Config.json
{
  "KP_list": {
    "NPS_Tikh": 4842
  },
  "FS": 4000,
  "dtype": "float",
  "stype": "random",
  "hytory_len": 1000,
  "overlap": 4000,
  "CurrentTime": "ns=0;i=1100",
  "KP_structure": {
    "KT_1": {
      "hydrophone": "ns=0;i=1111",
      "pressure": "ns=0;i=1112"
    },
    "KT_2":
    {
      "hydrophone": "ns=0;i=1113",
      "pressure": "ns=0;i=1114"
    }
  }
}

























main.py
import PLC_opc_server


if __name__ == "__main__":
    Servers = PLC_opc_server.OPC_construct(debug_mode=False)
    Servers.start_srvs()










OPC_KP_point.py
import imp
from multiprocessing.spawn import import_main_path
from turtle import st
from opcua import Server, ua
import numpy as np
import datetime
import time
import collections
from threading import Thread


class OPC_KP:
    def __init__(self, name, config, debug_mode=False):
        self.name = name
        self.port = config['KP_list'][name]
        self.fs = config['FS']
        self.dtype = config['dtype']
        self.stype = config['stype']
        self.hytory_len = config["hytory_len"]
        self.KP_structure = config["KP_structure"]
        self.server_time_tag = config["CurrentTime"]
        self.overlap = int(config["overlap"])
        self.point_list = []

        self.server = Server()
        self.server.set_server_name(f'TIK-PLC {name}')
        self.server.set_endpoint(f"opc.tcp://0.0.0.0:{self.port}")
        self.addspace = self.server.register_namespace(f"OPCUA {self.name}_imit")
        # self.addspace = 0
        self.node = self.server.get_objects_node()

        self.h1_arr = collections.deque(maxlen=int(self.fs + self.overlap))
        self.h2_arr = collections.deque(maxlen=int(self.fs + self.overlap))
        self.p1_arr = collections.deque(maxlen=int(self.fs + self.overlap))
        self.p2_arr = collections.deque(maxlen=int(self.fs + self.overlap))

        self.create_three(self.KP_structure, self.node)

        self.server_time = self.node.add_variable(ua.NodeId.from_string(self.server_time_tag), "Server_status", 0)
        self.server_time.set_writable()

        if not debug_mode:
            self.server_start()

    def create_three(self, KP_structure, parent="", parent_name=''):
        for obj in KP_structure:
            if type(KP_structure) == type({}):
                param = parent.add_object(self.addspace, obj)
                self.create_three(KP_structure[obj], param, obj)
            else:

                point = parent.add_variable(ua.NodeId.from_string(KP_structure), parent_name, 0)
                point.set_writable()
                self.point_list.append(point)
                print(KP_structure)
                break

    def server_start(self):
        self.server.start()
        self.timer = 0
        for point in self.point_list:
            self.server.historize_node_data_change(point, period=datetime.timedelta(seconds=self.hytory_len),
                                                   count=0)
        tyme_var = ua.VariantType.DateTime
        var_type = ua.VariantType.Float
        if self.dtype == 'float':
            var_type = ua.VariantType.Float
        elif self.dtype == 'double':
            var_type = ua.VariantType.Double

        def h1_thr():
            h1 = np.random.random(self.fs)
            self.h1_arr.extend(h1)
            curr_arrh1 = np.array(self.h1_arr)
            self.point_list[0].set_data_value(curr_arrh1.tolist(), var_type)

        def p1_thr():
            p1 = np.random.random(self.fs) + 5
            self.p1_arr.extend(p1)
            curr_arrp1 = np.array(self.p1_arr)
            self.point_list[1].set_data_value(curr_arrp1.tolist(), var_type)

        def h2_thr():
            h2 = np.random.random(self.fs)
            self.h2_arr.extend(h2)
            curr_arrh2 = np.array(self.h2_arr)
            self.point_list[2].set_data_value(curr_arrh2.tolist(), var_type)

        def p2_thr():
            p2 = np.random.random(self.fs) + 5
            self.p2_arr.extend(p2)
            curr_arrp2 = np.array(self.p2_arr)
            self.point_list[3].set_data_value(curr_arrp2.tolist(), var_type)

        while True:
            ee = time.time()
            start_time = time.time()
            e2 = time.time()

            thr1_h = Thread(target=h1_thr)
            thr1_p = Thread(target=p1_thr)
            thr2_h = Thread(target=h2_thr)
            thr2_p = Thread(target=p2_thr)

            thr1_h.start()
            thr1_p.start()
            thr2_h.start()
            thr2_p.start()

            thr1_h.join()
            thr1_p.join()
            thr2_h.join()
            thr2_p.join()

            end_time = time.time()
            dt = (end_time - start_time)
            time.sleep(1 - dt - 0.001)

























PLC_opc_server.py
from opcua import Server, ua
from random import randint
import datetime
import time
from multiprocessing import Process
import OPC_KP_point
import json


class OPC_construct:
    def __init__(self, debug_mode=True):
        f = open('Config.json')
        config = json.loads(f.read())
        f.close()

        self.debug_mode = debug_mode
        self.KP_list = config['KP_list']
        self.procces_list = []
        self.servers_list = []

        for KP in self.KP_list:
            if not self.debug_mode:
                Proc = Process(target=OPC_KP_point.OPC_KP, args=(KP, config))
                self.procces_list.append(Proc)
            else:
                self.procces_list.append(OPC_KP_point.OPC_KP(name=KP, config=config, debug_mode=self.debug_mode))
            print(f'Created {KP}')

    def start_srvs(self):
        for proc in self.procces_list:
            if not self.debug_mode:
                proc.start()
            else:
                proc.server_start()
            print('Server started')