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