Вы находитесь на странице: 1из 8

9.

0 Open Server
La gua de usuario esta diseada para explicar como usar Open Server para accesar a GAP, MBAL o
PROSPER desde programas externos.

El documento da un panorama general del uso de Open Server. Luego da detalles completos de
cmo usar esta opcin con GAP, MBAL o PROSPER.

La gua asume que se est familiarizado con la terminologa y operacin bsica de Windows, de GAP,
PROSPER y/o MBAL y con el uso de macros Visual Basic Acces en Excel.

Macro es un programa escrito o grabado por el usuario que almacena una serie de comandos de
Microsoft Excel que pueden utilizarse posteriormente como un nico comando. Mediante las macros
pueden automatizarse las tareas complejas y puede reducirse el nmero de pasos necesarios para
realizar las tareas que se ejecuten con ms frecuencia. Las macros se graban en el lenguaje de
programacin de Visual Basic para aplicaciones de Microsoft. Tambin pueden escribirse
directamente utilizando el Editor de Visual Basic.

Open Server fue diseado para proveer de una Arquitectura Abierta a los productos de Petroleum
Experts. Esto permite que los programas de PETEX puedan ser directamente accesados y
manejados por otros programas.

Especficamente, Open Server permite a otros programas (tal como el Excel, programas escritos en
Visual Basic) accesar funciones pblicas en los programas de PETEX. Esas funciones pblicas son
accesadas por un programa externo con un procedimiento automatizado.

Funciones Bsicas
Las tres funciones bsicas ms importantes son: GetValue, SetValue y DoCommand.

GetValue. Esta funcin permite a un programa externo preguntar por el valor de un dato en un
programa de PETEX. Es posible obtener el valor de cualquier apartado de datos que normalmente se
accesan con la interfaz de usuario de los programas PETEX. Cada apartado de datos est definido
por una secuencia de texto nica.

SetValue. Esta funcin permite a un programa externo cambiar el valor de un dato en un programa de
PETEX. Es posible cambiar el valor de cualquier apartado de datos que normalmente se accesan con
la interfaz de usuario de los programas PETEX. Es posible tambin construir un grupo de datos de un
bosquejo usando la funcin SetValue.
Sin embargo, se recomienda que se use la interfaz de usuario para construir partes de un grupo de
datos que no requieren ninguna automatizacin. Esto permitir que se lleve a cabo la revisin de
calidad normal durante el proceso de construccin de un modelo.
Cada apartado de datos est definido por una secuencia de texto nica.

DoCommand. Esta funcin permite que se realicen los clculos en un programa de PETEX. Cada
tipo de calculo se define por una secuencia de texto nica.
Solamente un subgrupo de clculos disponibles mediante la interfaz de usuario de los productos
PETEX estn disponibles usando Open Server. En particular la funcin DoCommand ayuda en los
clculos que son aplicables a un uso automatizado por ejemplo una prediccin en GAP. Sin embargo

139
no ayuda en los clculos que requieren la interfaz de usuario para un uso correcto por ejemplo un
ajuste grafico en MBAL.

Hay dos mtodos para llamar las funciones pblicas. Uno es el mtodo automtico, en ingls
Automation y el segundo es el mtodo por pasos, en ingls Batch File.

La sintaxis exacta de cmo llamar las funciones en cada uno de los mtodos se encuentra en la
seccin 4, de la gua de usuario de Open Server.

Usos Potenciales
-Corridas paso a paso, para visualizar resultados parciales en corridas demasiado tardadas.
-Reportes personalizados, para manejo de la informacin en formatos preestablecidos.
-Importar/Exportar datos, para transferir datos entre los programas PETEX y bases de datos.
-Corridas de los programas de PETEX con otros tipos de software especializado.

Macro de Ejemplo

El siguiente ejemplo fue elaborado para la plataforma Akal-N, en el cual se especifican las
condiciones de operacin de los pozos, abre un archivo de GAP y ejecuta una redistribucin del gas
de BN total disponible entre los pozos de la plataforma para una presin de separacin o salida
especificada.
Los resultados se muestran en una hoja de clculo de Excel.

La Macro se divide en un nmero de subrutinas y funciones. La subrutina principal se llama DoAll ( ).


Las otras cinco subrutinas y funciones permiten llamar y ejecutar las funciones pblicas de los
programas de PETEX.

140
' Este programa abre un archivo de GAP y ejecuta una redistribucin
' del gas de BN total disponible entre los pozos de la plataforma para
' una presin de separacin o salida especificada.
' Los resultados se muestran en una hoja de calculo de Excel

' Declaracin de variables


Dim Server As Object
Dim Command As String
Dim AppName As String
Dim NumResults As Integer
Dim NumWells As Integer
Dim Res As String
Dim Res2 As String
Dim IndexStr As String
Dim CellStr As String
Dim WellStr As String
Dim ColStr As String
Dim i As Integer
Dim j As Integer
Dim col As Integer
Dim l As Long
Dim l2 As Long
Dim CellName As String
Dim RowStr As String
Dim CellValue As String

Sub DoAll()
' Crear una conexin con PETEX Open Server object
Set Server = CreateObject("PX32.OpenServer.1")

' Leer el archivo especificado en la celda E14


' Note que debe especificar el nombre y ubicacin del archivo
' en la celda E14 del archivo de GAP
DoSlowCmd "GAP.OPENFILE(""" + Range("E14") + """)"
' Inicializar las variables
DoCmd "GAP.RESETALLOCINPUTS()"

' Seleccin de los datos de entrada -


' Estatus de los pozos (0=operando , 1=cerrado)
' Note que los valores se leen de la hoja de calculo de Excel
DoSet Range("E5"), Range("F5")
DoSet Range("E6"), Range("F6")
DoSet Range("E7"), Range("F7")
DoSet Range("E8"), Range("F8")
DoSet Range("E9"), Range("F9")
' Gas de BN disponible y Presin de Separacin o Salida
' Note que los valores se leen de la hoja de calculo de Excel
DoSet Range("E18"), Range("H18")
DoSet Range("E19"), Range("H19")

' Ejecutar una redistribucin - note que el argumento, 1, significa

141
' que una redistribucin optima ser ejecutada
DoSlowCmd "GAP.DOALLOCATE(1)"

' Obtener el numero de pozos del sistema


' En la plataforma Akal-N hay 5 pozos
NumWells = DoGet("GAP.MOD[0].WELL.COUNT")
' Obtener el numero de resultados - por ejemplo en nuestro caso
' solo se usa un valor de gas disponible - por lo tanto ser uno
NumResults = DoGet("GAP.MOD[0].SEP[0].ALCTPRES.COUNT")

' col es el numero de columna en la hoja de calculo donde se inicia


' la colocacin de resultados - inicializa en 5 (que es la columna E)
col = 5
' Ciclo para obtener los resultados y desplegarlos en la hoja de calculo
' Ciclo para los Pozos
For j = 0 To NumWells - 1
' Construccin de las etiquetas de los pozos -en GAP los Pozos se identifican como
' POZO1=C-91, POZO2=C-1045D, POZO3=C-1081, POZO4=C-1082, POZO5=C-3063
WellStr = "{POZO" + CStr(j + 1) + "}"
' Ciclo para los resultados
For i = 0 To NumResults - 1
' Construir la letra de columna en la hoja de calculo
ColStr = Chr(Asc("A") + col)
' Construir el indice para colocar los resultados
IndexStr = CStr(i)
' Obtener la etiqueta del pozo y colocarla en la hoja de calculo
' Res = "GAP.MOD[0].WELL[" + WellStr + "].LABEL"
' Range(ColStr + "28") = DoGet(Res)
' Obtener el valor del gas disponible y colocarlo en la hoja de calculo
Res = "GAP.MOD[0].GASAV[0]"
Range(ColStr + "29") = DoGet(Res)
' Obtener el valor de la presin de salida o separacin y colocarla en la hoja de calculo
Res = "GAP.MOD[0].SEP[0].ALCTPRES[" + IndexStr + "]"
Range(ColStr + "30") = DoGet(Res)
' Obtener el valor de gas de BN inyectado a los pozos y colocarlo en la hoja de calculo
Res = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[5][" + IndexStr + "]"
Range(ColStr + "32") = DoGet(Res)
' Get the oil produced and place in spreadsheet
Res = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[{Oil Produced}][" + IndexStr + "]"
Range(ColStr + "33") = DoGet(Res)
' Get the gas produced and place in spreadsheet
Res = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[{Gas Produced}][" + IndexStr + "]"
Range(ColStr + "34") = DoGet(Res)
' Get the water produced and place in spreadsheet
Res = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[{Water Produced}][" + IndexStr + "]"
Range(ColStr + "35") = DoGet(Res)
' Get the manifold pressure and dP choke
Res = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[{Pressure}][" + IndexStr + "]"
Res2 = "GAP.MOD[0].WELL[" + WellStr + "].ALCTRES[{dP Choke}][" + IndexStr + "]"
' Calculate the operating pressure and place in spreadsheet
Range(ColStr + "36") = CDbl(DoGet(Res)) + CDbl(DoGet(Res2))

142
' Get the dP choke and place in spreadsheet
Range(ColStr + "37") = DoGet(Res2)
col = col + 1
Next
Next
' We have finished looping over the wells - now
' retrieve some results for the separator
col = col + 1
' Construct the spreadsheet column letter
ColStr = Chr(Asc("A") + col)
' Get separator label
Res = "GAP.MOD[0].SEP[0].LABEL"
Range(ColStr + "28") = DoGet(Res)
' Get the gas available
Res = "GAP.MOD[0].GASAV[0]"
Range(ColStr + "29") = DoGet(Res)
' Get separator pressure
Res = "GAP.MOD[0].SEP[0].ALCTPRES[" + IndexStr + "]"
Range(ColStr + "30") = DoGet(Res)
' Get the Gas Injected
Res = "GAP.MOD[0].SEP[0].ALCTRES[5][" + IndexStr + "]"
Range(ColStr + "32") = DoGet(Res)
' Get oil produced
Res = "GAP.MOD[0].SEP[0].ALCTRES[{Oil Produced}][" + IndexStr + "]"
Range(ColStr + "33") = DoGet(Res)
' Get gas produced
Res = "GAP.MOD[0].SEP[0].ALCTRES[{Gas Produced}][" + IndexStr + "]"
Range(ColStr + "34") = DoGet(Res)
' Get water produced
Res = "GAP.MOD[0].SEP[0].ALCTRES[{Water Produced}][" + IndexStr + "]"
Range(ColStr + "35") = DoGet(Res)

' Disconnect from PETEX server object


Set Server = Nothing
MsgBox "FINISHED Macro"
End Sub

143
' This utility function extracts the application name from the tag string
Function GetAppName(Strval As String) As String
Dim Pos
Pos = InStr(Strval, ".")
If Pos < 2 Then
MsgBox "Badly formed tag string"
End
End If
GetAppName = Left(Strval, Pos - 1)
If StrComp(GetAppName, "GAP", 1) <> 0 And StrComp(GetAppName, "MBAL", 1) <> 0 Then
MsgBox "Unrecognised application name in tag string"
End
End If
End Function

' Perform a command, then check for errors


Sub DoCmd(Cmd As String)
Dim lErr As Long
lErr = Server.DoCommand(Cmd)
If lErr > 0 Then
MsgBox Server.GetErrorDescription(lErr)
Set Server = Nothing
End
End If
End Sub

'Set a value, then check for errors


Sub DoSet(Sv As String, Val)
Dim lErr As Long
lErr = Server.SetValue(Sv, Val)
AppName = GetAppName(Sv)
lErr = Server.GetLastError(AppName)
If lErr > 0 Then
MsgBox Server.GetErrorDescription(lErr)
Set Server = Nothing
End
End If
End Sub

' Get a value, then check for errors


Function DoGet(Gv As String) As String
Dim lErr As Long
DoGet = Server.GetValue(Gv)
AppName = GetAppName(Gv)
lErr = Server.GetLastError(AppName)
If lErr > 0 Then
MsgBox Server.GetLastErrorMessage(AppName)
Set Server = Nothing
End
End If
End Function

144
' Perform a command, then wait for the command to exit
' Then check for errors
Sub DoSlowCmd(Cmd As String)
Dim StartTime As Single
Dim EndTime As Single
Dim CurrentTime As Single
Dim lErr As Long
Dim bLoop As Boolean

AppName = GetAppName(Cmd)
lErr = Server.DoCommandAsync(Cmd)
If lErr > 0 Then
MsgBox Server.GetErrorDescription(lErr)
Set Server = Nothing
End
End If
While Server.IsBusy(AppName) > 0
StartTime = Timer
EndTime = StartTime + 2
Do
CurrentTime = Timer
DoEvents
bLoop = True
Rem Check first for the case where we have gone over midnight
Rem and the number of seconds will go back to zero
If CurrentTime < StartTime Then
bLoop = False
Rem Now check for the 2 second pause finishing
ElseIf CurrentTime > EndTime Then
bLoop = False
End If
Loop While bLoop
Wend
AppName = GetAppName(Cmd)
lErr = Server.GetLastError(AppName)
If lErr > 0 Then
MsgBox Server.GetErrorDescription(lErr)
Set Server = Nothing
End
End If
End Sub

145
' Perform a function in GAP, then retrieve return value
' Finally, check for errors
Function DoGAPFunc(Gv As String) As String
DoSlowCmd Gv
DoGAPFunc = DoGet("GAP.LASTCMDRET")
lErr = Server.GetLastError("GAP")
If lErr > 0 Then
MsgBox Server.GetErrorDescription(lErr)
End
End If
End Function

146

Вам также может понравиться