• No se han encontrado resultados

Sintaxis para la comunicación DDE en Aspen Hysys

5 METODOLOGÍA

5.2 METODOLOGIA DE INTEGRACION EN LA COMUNICACIÓN ENTRE ASPEN

5.2.5 Sintaxis para la comunicación DDE en Aspen Hysys

La sintaxis utilizada para realizar la comunicación DDE se puede realizar bajo el lenguaje de programación Visual Basic (VBA). Aspen Hysys V7.3 posee un editor de macros en el cual podemos entablar la comunicación y llamar las variables del proceso. La información requerida para establecer esta comunicación se encuentra en la guía de personalización (Aspen HYSYS, Customization Guide) publicada por AspenTech®.

Cabe resaltar que es necesario tener conocimientos básicos en programación con VBA para la creación de una macro en la herramienta Languaje Macro Editor de Hysys. A continuación se muestra algunos ejemplos de código fuente, importantes para establecer comunicación con RSLogix5000.

 Sub-rutina encargada de establecer comunicación DDE.

 Sintaxis para obtener el valor de una especificación (en este caso Temperatura) de cualquier unidad de operación y cargarlo en una variable.

A continuación se muestra la sintaxis empleada para obtener las especificaciones de una unidad de operación del sistema de Tea simulado, para este caso se cargan tres variables diferentes con el valor de Nivel, Temperatura y Presión del Tanque KO Drum, teniendo presente la designación de las variables que se muestran en la Tabla 11.

 Sintaxis para obtener el valor de una especificación de una corriente (en este caso Temperatura) y cargarlo en una variable.

Siguiendo los mismos pasos del anterior ejercicio, se pretende cargar las especificaciones de una corriente del sistema de Tea simulado, ahora se cargaran los valores de Presión, Flujo y temperatura de la corriente de entrada al sistema, según como se designaron las variables (ver Tabla 11).

Dim simCase AsObject Set simCase = ActiveCase

If simCase IsNothingThen

MsgBox ("No existe un ''HYSYS Case'' Abierto.") End

EndIf

Private Function OpenRSLinx() On Error Resume Next

'Iniciando conección DDE con RSLinx

OpenRSLinx = DDEInitiate("RSLINX", "Proyecto")' “Proyecto” es el nombre del tópico creado en RSLinx

'Verificando conexión

If Err.Number <> 0 Then

MsgBox "Error Connecting to topic", vbExclamation, "Error" OpenRSLinx = 0 'Return false if there was an error

End If End Function

Set Variable = simCase.Flowsheet.Operations.Item("unidad de operacion").VesselTemperature

’variables KO

Set vessel_100 = Simcase.Flowsheet.Operations.Item("V-100") N_vessel_100=vessel_100.LiquidPercentLevel.GetValue("%") T_vessel_100=vessel_100.VesselTemperature.GetValue("C") P_vessel_100=vessel_100.VesselPressure.GetValue("psig")

Set Corriente = simCase.Flowsheet.MaterialStreams.Item("Nombre Corriente") Variable=Corriente.Temperature.GetValue("C")

 Sintaxis para enviar el valor de una variable en un tag creado en RSLogix 5000

Ahora estas variables que contienen valores de Presión, Flujo, Temperatura y Nivel serán enviadas al respectivo Tag que se creó con anterioridad en RSLogix 5000, como se muestra a continuación.

 Sintaxis para recepción del valor de un tag creado en RSLogix 5000 y asignarlo a una variable en Aspen Hysys.

La sintaxis empleada para asignar el valor que contiene un Tag en RSLogix 5000 a una variable del proceso simulado en Aspen Hysys es muy útil, ya que con esto se pretende manipular la apertura de válvulas que hacen parte de los diferentes lazos de control del sistema de Tea simulado. El siguiente código muestra cómo se puede lograr, tomando como ejemplo la válvula V-6 que hace parte del lazo de control de nivel del tanque KO Drum.

' variables flujo entrada

Set entrada = Simcase.Flowsheet.MaterialStreams.Item("F-018") F_entrada=entrada.MolarFlow.GetValue("MMSCFD")

P_entrada=entrada.Pressure.GetValue("psig") T_entrada= entrada.Temperature.GetValue("C")

rslinx = OpenRSLinx() 'Abrir conexión con RSlinx

DDEPoke rslinx, "Variable", Tag

DDETerminate rslinx 'Terminar conexión DDE

rslinx = OpenRSLinx() 'Abrir conexión con RSlinx

DDEPoke rslinx, "Program:MainProgram.F18_FIT_01", F_entrada DDEPoke rslinx, "Program:MainProgram.F18_PIT_01", P_entrada DDEPoke rslinx, "Program:MainProgram.F18_TIT_01", T_entrada

DDEPoke rslinx, "Program:MainProgram.KO_LIC_03VP", N_vessel_100 DDEPoke rslinx, "Program:MainProgram.KO_TI_01", T_vessel_100 DDEPoke rslinx, "Program:MainProgram.KO_PI_01", P_vessel_100

DDETerminate rslinx 'Terminar conexión DDE

rslinx = OpenRSLinx() 'Abrir conexion con RSlinx

Variable = DDERequest(rslinx,"Tag",1)

simCase.Flowsheet.Operations.Item("Nombre unidad").PercentOpenValue =Variable DDETerminate rslinx 'Terminar conexion DDE

rslinx = OpenRSLinx() 'Abrir conexion con RSlinx

VC_LIC100=DDERequest(rslinx,"Program:MainProgram.KO_LIC_05VC",1) Simcase.Flowsheet.Operations.Item("V-6").PercentOpenValue =VC_LIC100

De esta manera se puede comunicar las variables que queramos de cualquier proceso simulado en Aspen Hysys a RSLogix 5000, solo hay que estar atentos a la designación de variables y Tags, así como de la asociación entre las mismas, para que no haya errores en el momento de realizar la comunicación.

A continuación se muestra la sintaxis completa que correrá en el editor de Macros de Aspen Hysys.

Public hyApp As HYSYS.Application Public Simcase As SimulationCase Sub Main ()

Do

Dim Simcase As Object Set Simcase=ActiveCase If Simcase Is Nothing Then

MsgBox ("No existe un ''HYSYS Case'' Abierto.") End

End If

' variables flujo entrada

Set entrada = Simcase.Flowsheet.MaterialStreams.Item("F-018") F_entrada=entrada.MolarFlow.GetValue("MMSCFD")

P_entrada=entrada.Pressure.GetValue("psig") T_entrada= entrada.Temperature.GetValue("C")

'variables KO

Set vessel_100 = Simcase.Flowsheet.Operations.Item("V-100") N_vessel_100=vessel_100.LiquidPercentLevel.GetValue("%") T_vessel_100=vessel_100.VesselTemperature.GetValue("C") P_vessel_100=vessel_100.VesselPressure.GetValue("psig")

'variables sello liquido

Set vessel_101 = Simcase.Flowsheet.Operations.Item("V-101") N_vessel_101=vessel_101.LiquidPercentLevel.GetValue("%") T_vessel_101=vessel_101.VesselTemperature.GetValue("F") P_vessel_101=vessel_101.VesselPressure.GetValue("psig")

F_vessel_101= vessel_101.VapourMolarFlow.GetValue("MMSCFD")

'variables stack

Set Stack = Simcase.Flowsheet.MaterialStreams.Item("F-025") T_Stack= Stack.Temperature.GetValue("C")

P_Stack= Stack.Pressure.GetValue("psig")

F_Stack= Stack.MolarFlow.GetValue("MMSCFD")

'Variables entrada aire

Set Aire = Simcase.Flowsheet.MaterialStreams.Item("F-026") T_Aire=Aire.Temperature.GetValue("C")

P_Aire=Aire.Pressure.GetValue("psig")

F_Aire=Aire.MolarFlow.GetValue("MMSCFD")

' Variables llama

Set Llama = Simcase.Flowsheet.MaterialStreams.Item("F-028") T_Llama = Llama.Temperature.GetValue("C")

P_Llama = Llama.Pressure.GetValue("psig")

Delay(10)

rslinx = OpenRsLinx()'Abrir conexion con RSlinx

DDEPoke rslinx, "Program:MainProgram.F18_FIT_01", F_entrada DDEPoke rslinx, "Program:MainProgram.F18_PIT_01", P_entrada DDEPoke rslinx, "Program:MainProgram.F18_TIT_01", T_entrada

DDEPoke rslinx, "Program:MainProgram.KO_LIC_03VP", N_vessel_100 DDEPoke rslinx, "Program:MainProgram.KO_TI_01", T_vessel_100 DDEPoke rslinx, "Program:MainProgram.KO_PI_01", P_vessel_100

DDEPoke rslinx, "Program:MainProgram.SL_LIC_03VP", N_vessel_101 DDEPoke rslinx, "Program:MainProgram.SL_TIC_03VP", T_vessel_101 DDEPoke rslinx, "Program:MainProgram.SL_TI_01", T_vessel_101 DDEPoke rslinx, "Program:MainProgram.SL_PI_01", P_vessel_101 DDEPoke rslinx, "Program:MainProgram.SL_FI_01", F_vessel_101

DDEPoke rslinx, "Program:MainProgram.S_TI_01",T_Stack DDEPoke rslinx, "Program:MainProgram.S_PI_01", P_Stack DDEPoke rslinx, "Program:MainProgram.S_FI_01",F_Stack DDEPoke rslinx, "Program:MainProgram.S_RC_01VP", F_Aire DDEPoke rslinx, "Program:MainProgram.S_RC_03SP", F_Stack

DDEPoke rslinx, "Program:MainProgram.F026_TI_01", T_Aire DDEPoke rslinx, "Program:MainProgram.F026_PI_01", P_Aire DDEPoke rslinx, "Program:MainProgram.F026_FI_01", F_Aire

DDEPoke rslinx, "Program:MainProgram.F028_TI_01", T_Llama DDEPoke rslinx, "Program:MainProgram.F028_PI_01", P_Llama DDEPoke rslinx, "Program:MainProgram.F028_FI_01", F_Llama

VC_LIC100=DDERequest(rslinx,"Program:MainProgram.KO_LIC_05VC",1) Simcase.Flowsheet.Operations.Item("V-6").PercentOpenValue =VC_LIC100 VC_LIC101=DDERequest(rslinx,"Program:MainProgram.SL_LIC_05VC",1) Simcase.Flowsheet.Operations.Item("V-8").PercentOpenValue =VC_LIC101 VC_TIC100=DDERequest(rslinx,"Program:MainProgram.SL_TIC_05VC",1) Simcase.Flowsheet.Operations.Item("TIC-100").OP.SetValue VC_TIC100 VC_FRC100=DDERequest(rslinx,"Program:MainProgram.S_RC_02VC",1) Simcase.Flowsheet.Operations.Item("V-9").PercentOpenValue =VC_FRC100

DDETerminate rslinx 'Terminar conexion DDE

Loop While True

Una vez la programación ha sido desarrollada en el editor de macros de Aspen Hysys, se da click en el icono start, para que empiece la comunicación como se muestra en la Figura 111.

Figura 111. Editor de Macros de Macros. Fuente: Adaptado Aspen Hysys. Sub Delay(ByVal Tiempo As Double)

Dim HoraActual As Double 'On Local Error Resume Next HoraActual = Timer

Do Until Timer >= HoraActual + (Tiempo / 1000) DoEvents

Loop

End Sub

Private Function OpenRsLinx()

On Error Resume Next

'Abrir el programa en en Rslinx

OpenRsLinx = DDEInitiate("rslinx", "Proyecto") 'Entre comillas app y topic

'Verifica si se realizó la conexión If Err.Number <> 0 Then

MsgBox "Error Conecting to topic", vbExclamation, "Error" OpenRsLinx = 0 'Devuelve FALSE si hubo un error End If