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