Beispiel #1
0
    def datachange_notification(self, node, val, data):
        thread_handler = threading.Thread(
            target=funcion_handler,
            args=(node, val))  # Se realiza la descarga por un thread
        thread_handler.start()

    def event_notification(self, event):
        global eventoColor, eventoTexto
        eventoColor = event
        eventoTexto = event


cliente = Cliente("opc.tcp://localhost:4840/freeopcua/server/",
                  suscribir_eventos=True,
                  SubHandler=SubHandler)
cliente.conectar()

# Aplicación con Dash
colors = {'background': '#111111', 'text': '#7FDBFF'}

app = dash.Dash()
app.layout = html.Div(
    style={'backgroundColor': colors['background']},
    children=[
        html.H1(children='Aplicación de Control',
                style={
                    'textAlign': 'center',
                    'color': colors['text']
                }),
        dcc.Interval(id='interval-component',
                     interval=int(1 / frecMax * 1000),
def QuadrupleTankRoutine():

    cliente = Cliente("opc.tcp://localhost:4840/freeopcua/server/",
                      suscribir_eventos=True,
                      SubHandler=SubHandler)
    cliente.conectar()
    # cliente.subscribir_mv() # Se subscribe a las variables manipuladas

    ######################### Main loop #################################

    # Setup
    x0 = [40, 40, 40, 40]  # Condición inicial de los tanques
    # x0=[33.915, 35.224, 4.485, 3.914] #Condición inicial de los tanques (eq para u_eq = (0.5,0.5)) y gamma = (0.7,0.6)
    # x0=[28.029, 43.489, 10.091, 15.656] #Condic

    #
    # drh dfh dión inicial de los tanques (eq para u_eq = (0.5,0.5)) y gamma = (0.4,0.4)
    Hmax = 50
    voltmax = 10
    fps = 20
    sensibilidad = 0.01  # Cambio de las varibles manipuladas cada vez que se aprieta una tecla
    first_it = True

    sistema = QuadrupleTank(x0=x0, Hmax=Hmax, voltmax=voltmax)

    cliente.razones['razon1'].set_value(sistema.gamma[0])
    cliente.razones['razon2'].set_value(sistema.gamma[1])

    cliente.valvulas['valvula1'].set_value(0)
    cliente.valvulas['valvula2'].set_value(0)

    sistema.time_scaling = 1  # Para el tiempo
    running = True
    manual = False  # Control Manual o automático de las variables
    t = 0
    alturasMatrix = []

    while running:

        # Actualización del sistema de forma manual
        if manual:
            running, u = interfaz.eventos(running, sensibilidad,
                                          sistema.volt[0], sistema.volt[1],
                                          sistema.gamma[0], sistema.gamma[1])
            sistema.volt[0] = u['valvula1']
            sistema.volt[1] = u['valvula2']
            sistema.gamma[0] = u['razon1']
            sistema.gamma[1] = u['razon2']

            # Envío de los valores por OPC cuando se está en forma manual
            # Obtención de los pumps
            cliente.valvulas['valvula1'].set_value(u['valvula1'])
            cliente.valvulas['valvula2'].set_value(u['valvula2'])

            # Obtención de los switches
            cliente.razones['razon1'].set_value(u['razon1'])
            cliente.razones['razon2'].set_value(u['razon2'])
        else:
            volt1 = cliente.valvulas['valvula1'].get_value()
            volt2 = cliente.valvulas['valvula2'].get_value()

            gamma1 = cliente.razones['razon1'].get_value()
            gamma2 = cliente.razones['razon2'].get_value()

            if volt1 > 1 or volt1 < -1 or volt2 > 1 or volt2 < -1 \
                    or gamma1 > 1 or gamma1 < 0 or gamma2 > 1 or gamma2 < 0:
                raise ValueError('Valores fuera del rango específicado')

            sistema.volt[0] = volt1
            sistema.volt[1] = volt2
            sistema.gamma[0] = gamma1
            sistema.gamma[1] = gamma2

        ####### Simulación del sistema ######
        if first_it:
            sistema.ti = time.time()
            first_it = False

        alturas = sistema.sim()

        ############ UPDATE CLIENTE OPC ##################################
        cliente.alturas['H1'].set_value(alturas[0])
        cliente.alturas['H2'].set_value(alturas[1])
        cliente.alturas['H3'].set_value(alturas[2])
        cliente.alturas['H4'].set_value(alturas[3])