API de servicio web tutorial en VBA
Artículo técnico
Webservice ist eine Kommunikation zwischen Maschinen beziehungsweise Programmen. Diese Kommunikation wird über das Netzwerk bereitgestellt und kann daher von jedem Programm, welches Zeichenketten über das HTTP-Protokoll verschicken und empfangen kann, genutzt werden. RFEM 6 y RSTAB 9 proporcionan una interfaz basada en estos servicios web multiplataforma. Este tutorial muestra los conceptos básicos sobre el uso del lenguaje de programación VBA.
Grundlagen Webservice API am Beispiel von VBA
Para el formateo de la cadena, se usa el formato XML según las especificaciones del protocolo SOAP. La siguiente consulta sirve como ejemplo:
<Sobre xmlns = "http://schemas.xmlsoap.org/soap/envelope/">
<Cuerpo>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>
</sobre>
Ein typisches Element der XML-Formatierung ist der Beginn eines Abschnitts mit dem Zeichen "<" Danach folgt ein Bezeichner und, falls keine weiteren untergeordneten Elemente folgen, es wird der Abschnitt mit "/>" beendet. Un ejemplo es la tercera línea:
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
Si hay subelementos, comienza con "<", el comando y ">" y termina con "</", el comando y ">". El ejemplo apropiado es la sección "Cuerpo":
<Cuerpo>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>
El formato con espacios y saltos de línea se usa aquí sólo con fines ilustrativos. Esto no es necesario para la transferencia. Los elementos "Cuerpo" y "Envolvente" son elementos estándar para la transferencia y se utilizan para cada comando.
Todos los comandos disponibles se pueden leer utilizando la interfaz WSDL. Es gibt Software, mit deren Hilfe daraus Listen erzeugt werden können. Uno de estos programas es SoapUI. Für die API von RFEM 6 gibt es zwei Listen, die Befehle für die Anwendung und die für das Modell. Ambas listas se pueden descargar al final de este artículo.
Dado que los comandos se envían a través de HTTP, se requieren direcciones URL para el direccionamiento. La dirección predeterminada de las aplicaciones RSTAB/RFEM es "http://localhost: 8081/" y se puede cambiar en la configuración del programa. A los modelos abiertos se les asignan direcciones en orden ascendente para que el primer modelo abierto tenga la dirección "http://localhost: 8082/". Para obtener la dirección del modelo activo, se envía el comando "get_active_model". Una respuesta correspondiente de RFEM 6 se ve así:
<? xml version = "1.0"?>
<Sobre xmlns: soap = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns: soap-enc = "http://schemas.xmlsoap.org/soap/encoding/"
xmlns: xsd = "http://www.w3.org/2001/XMLSchema"
xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance">
<jabón: cuerpo>
<n1: get_active_modelResponse
xmlns: n1 = "http://www.dlubal.com/rfem.xsd">
<valor>
http://127.0.0.1:8082/
</valor>
</n1: get_active_modelResponse>
</soap: Body>
</soap: Sobre>
Los detalles adicionales de la sección "Sobre" (alemán: Umschlag/Briefumschlag) sowie die vorangestellte Zeile "<?xml version="1.0"?>" sollen zunächst die verwendeten Standards aufzeigen und hier nicht weiter erörtert werden. En cualquier caso, puede ver que los elementos "Envelope" y "Body" se utilizan de nuevo. Innerhalb von "Body" steckt die Antwort von RFEM 6 durch den Befehlsnamen "get_active_model" und dem angehängten Wort "Response". El contenido de esta respuesta es un "valor", es decir, la dirección del modelo activo. Además, RFEM ahora está bloqueado para un mayor acceso.
En el siguiente ejemplo, queremos crear una barra con dos apoyos en nudo y una carga. Para poder comunicarse con RFEM a través de VBA, se requieren los siguientes objetos:
solicitud como MSXML2.XMLHTTP60
respuesta como MSXML2.DOMDocument
Das Objekt XMLHTTP60 hat eine integrierte Funktion zum Senden einer HTTP-Anfrage an eine URL und wird daher für die Anfrage verwendet. La respuesta se puede evaluar utilizando el documento DOM. El siguiente ejemplo combina la solicitud "get_active_model" mostrada anteriormente con los comandos utilizados en VBA:
' obtener la URL del modelo activo con el comando "get_active_model"
str_envelope =
"<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<get_active_model xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
"</Body>" & _
"</Envelope>"
' abrir solicitud y enviarla
request.Open "Publicar", "http://localhost: 8081/", Falso
request.Send (str_envelope)
' obtiene la respuesta y la transforma en un objeto xml
response.LoadXML (request.responseText)
Primero, la solicitud se guarda en formato XML en la variable "str_envelope" y la solicitud se abre en RFEM utilizando el método "Open" de la variable "request". El contenido de la variable "str_envelope" ahora se puede enviar utilizando el método "Enviar". Se puede acceder a la respuesta utilizando el método "ResponseText". En este caso específico, esto se importa directamente a través del método "LoadXML" de la variable "respuesta".
La variable "respuesta" del tipo DOMDocuments tiene el método LoadXML y, por lo tanto, puede reconocer el formato XML. La ventaja es que el tipo DOMDocuments también proporciona el método GetElementsByTagName. Esto le permite extraer elementos directamente del código. A continuación, se amplía el código anterior para que esté disponible la dirección URL del modelo:
' obtener http-status
status = request.status
Si el estado <> "200" Entonces
MsgBox "get_active_model: Envío no satisfactorio - & quot; & quot; & quot; response.Text
Exit Sub
End If
url_model = response.GetElementsByTagName ("valor") (0) .Text
Antes de leer la URL, se puede comprobar el estado de la respuesta. Son códigos de estado HTTP estandarizados. El estado "200" significa que la transferencia fue "correcta". Después de esta consulta, la URL del modelo se almacena en la cadena url_model. Para esto, se busca el elemento "valor" en la respuesta XML. Si una respuesta contiene varios elementos, todos los valores se almacenan dentro de la sección "valor", de forma que no es posible una evaluación con el identificador "valor", pero se tratan los subelementos de "valor". Descubra más en el ejemplo práctico. En el caso de la dirección del modelo, el único valor devuelto es la URL, por lo que "valor" es correcto aquí.
Ejemplo práctico en VBA
Ahora que conocemos todos los elementos básicos, sigue un ejemplo simple. Queremos crear una viga en dos pilares a los que se pueda aplicar una carga en la barra.
Primero, se definen e inicializan las variables descritas anteriormente:
' definir variables
Solicitud de atenuación como MSXML2.XMLHTTP60
Respuesta atenuada como MSXML2.DOMDocument60
Dim str_envelope como cadena
Atenuar url_app como cadena
Atenuar url_model como cadena
' variables de inicio
Establecer solicitud = Nuevo MSXML2.XMLHTTP60
Establecer respuesta = Nuevo MSXML2.DOMDocument60
Con respuesta
.async = Falso
.preserveWhiteSpace = False
.validateOnParse = Falso
.resolveExternals = Falso
' Usar la funcionalidad completa de XPath
.SetProperty "SelectionLanguage", "XPath"
' Agregar espacios de nombres específicos para trabajar con rutas
.SetProperty "SelectionNamespaces", "xmlns: soap =" "http://www.w3.org/2003/05/soap-envelope" "" & _
"xmlns: xsd =" "http://www.dlubal.com/rfem.xsd" "" & _
"xmlns: n1 =" "urn: schemas-microsoft-com: conjunto de filas" "" & _
"xmlns =" "http://www.dlubal.com/rfem.xsd" ""
Terminar con
url_app = "http://localhost: 8081/"
Además de las variables "solicitud" y "respuesta", se crea la cadena "str_envelope" para la solicitud y "url_app" y "url_model" para las direcciones de la aplicación y el modelo. Durante la inicialización, las especificaciones conocidas del protocolo SOAP se pueden transferir para evaluar el formato XML de la respuesta. La dirección del modelo se obtendrá más tarde, pero se debe especificar la dirección de la aplicación. Como ya se mencionó, se debe introducir la dirección predeterminada "http://localhost: 8081/".
El siguiente paso es probar la conexión con la aplicación. Para esta prueba, se consulta la información estándar de la aplicación utilizando el comando "get_information":
' compruebe la URL de la aplicación con el comando "get_information"
str_envelope = "<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<get_information xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
"</Body>" & _
"</Envelope>"
' abrir solicitud y enviarla
request.Open "Publicar", url_app, Falso
request.Send (str_envelope)
' obtiene la respuesta y la transforma en un objeto xml
response.LoadXML (request.responseText)
' obtener http-status
status = request.Status
Si el estado <> "200" Entonces
MsgBox "get_information: Envío no satisfactorio - & quot; & quot; & quot; response.Text
Exit Sub
End If
' leer la información de la aplicación
Dim str1 como cadena
str1 = ""
str1 = str1 & response.GetElementsByTagName ("nombre") (0) .Text & amp; vbLf
str1 = str1 & response.GetElementsByTagName ("tipo") (0) .Text & amp; vbLf
str1 = str1 & response.GetElementsByTagName ("versión") (0) .Text & amp; vbLf
str1 = str1 & response.GetElementsByTagName ("language_name") (0) .Text & amp; vbLf
str1 = str1 & response.GetElementsByTagName ("language_id") (0) .Text
MsgBox str1, vbInformation, "Response to" "get_information" "request"
Como ya se describió en la primera parte, la solicitud con formato XML se prepara y se guarda en "str_envelope". "request.Open" abre la conexión con la aplicación. La palabra clave "Publicar" representa el envío de la solicitud. El tercer parámetro se establece en "true" y, por lo tanto, se realiza una transmisión síncrona. Luego, "request.Send" envía la cadena preparada.
Después de la transferencia, la respuesta se guarda en "respuesta" y se verifica con "request.Status" para ver si la solicitud se realizó correctamente. Der Status wird dabei von RFEM vergeben, sodass diese bei einer fehlerhaften Anfrage, zum Beispiel einem unbekannten Befehl, einen Fehler zurückgibt. Si el estado no es "200", el programa se interrumpe y el error se muestra en una ventana (MsgBox).
Si no se han producido errores, ahora se puede leer la diversa información transferida usando "GetElementsByTagName". En el ejemplo específico, la información se muestra en una ventana.
Los siguientes elementos son muy similares, por lo que solo se describen las características especiales (el código fuente completo está disponible para descargar). Para configurar una viga en dos pilares con una carga en la barra, se requieren las siguientes funciones:
- Nodo - set_node
- Línea - set_line
- Material - set_material
- Sección - set_section
- Miembro - set_member
- Soporte en nudo - set_nodal_support
- Parámetros de cálculo - set_static_analysis_settings
- Caso de carga - set_load_case
- Carga de barra - set_member_load
Como la mayoría de los demás, la función "set_node" tiene muchos parámetros, pero generalmente no son necesarios. En la lista de comandos ya mencionada del modelo de RFEM, puede ver la variedad de parámetros. Sobre todo son importantes los parámetros que no están marcados como "opcionales", ya que deben completarse en cada caso. En el ejemplo, se transfieren los siguientes parámetros:
begin_modification (url_model)
' establecer el nudo 1 en [0,0,0] con el comando "set_node"
str_envelope =
"<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<set_node xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<type> TYPE_STANDARD </type>" & _
"<coordinate_1> 0 </coordinate_1>" & _
"<coordinate_2> 0 </coordinate_2>" & _
"<coordinate_3> 0 </coordinate_3>" & _
"</valor>" & _
"</set_node> & amp; _
"</Body>" & _
"</Envelope>"
Solo el número de nudo no es opcional y el resto se puede asignar. Además de los parámetros posibles, la lista de comandos también muestra listas por tipos. En este caso específico, actualmente son posibles cinco tipos diferentes. Se ha seleccionado el tipo predeterminado "TYPE_STANDARD". El primer nudo que se muestra aquí se crea en la ubicación (0; 0; 0), el segundo nudo en (5.5; 0; 0). Los valores para los números decimales son los siguientes:
...
"<valor xmlns =" "" ">" & _
"<no> 2 </no>" & _
"<type> TYPE_STANDARD </type>" & _
"<coordinate_1> 5.5 </coordinate_1>" & _
"<coordinate_2> 0 </coordinate_2>" & _
"<coordinate_3> 0 </coordinate_3>" & _
"</valor>" & _
...
Las listas son otra característica especial. La línea necesita dos nudos cuyos números se pueden transferir como una lista. Los elementos de una lista, como "definition_nodes", están separados por espacios:
...
"<set_line xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<type> TYPE_POLYLINE </type>" & _
"<definition_nodes> 1 2 </definition_nodes>" & _
"</valor>" & _
"</set_line>" & _
...
Para poder crear la barra, se debe crear una sección, que a su vez requiere un material. Las secciones y los materiales se pueden usar desde la base de datos interna. Por lo tanto, es suficiente especificar un identificador conocido. Para el material, el identificador es "S235" y la sección tiene el nombre "IPE 300":
...
"<set_section xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<material> 1 </material>" & _
"<tipo> TYPE_STANDARDIZED_STEEL </type>"
"<nombre> IPE 300 </name>" & _
"</valor>" & _
"</set_section> & amp; _
...
Para comprobar si un nombre como "IPE 300" es válido, puede utilizar la entrada en la interfaz gráfica de usuario.
Para introducir la barra en sí, no se requieren más conocimientos, pero para introducir un apoyo fijo, tiene que definir una rigidez elástica "infinita". La palabra clave "INF" se utiliza para la transferencia:
...
"<set_nodal_support xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<nodos> 1 </nodos>" & _
"<spring_x> INF </spring_x>" & _
"<spring_y> INF </spring_y>" & _
"<spring_z> INF </spring_z>" & _
"<Coacción_rotacional_x> INF </i> Coacción_rotacional_x>" & _
"<Coacción_de_rotación_y> 0 </b> Coacción_de_rotación_y>" & _
"<Coacción_de_rotación_z> INF </b>
"</valor>" & _
"</set_nodal_support> & amp; _
...
La creación del caso de carga y los parámetros de cálculo no requiere ningún conocimiento adicional. La última peculiaridad es un valor adicional al crear la carga, ya que se debe especificar fuera del área "<valor>". En el caso de una carga en barra, el caso de carga correspondiente se debe transferir allí:
...
"<set_member_load xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<load_case_no xmlns =" "" "> 1 </load_case_no>" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<load_type> LOAD_TYPE_FORCE </load_type>" & _
"<members> 1 </members>" & _
"<load_distribution> LOAD_DISTRIBUTION_UNIFORM </load_distribution>" & _
"<load_direction> LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE </load_direction>" & _
"<magnitud> 1000 </magnitud>" & _
"</valor>" & _
"</set_member_load> & amp; _
...
Ergänzend dazu sei erwähnt, dass die Reihenfolge der Elemente innerhalb des Bereichs "value" keine Rolle spielt, außerhalb aber schon. Der angegebene Lastfall muss also vor dem Bereich "value" stehen.
Además de las funciones anteriores para crear y exportar datos, hay dos funciones especiales que se presentan aquí. Si se transfieren elementos al programa, el programa pasa automáticamente al modo "Modificación". El programa comprueba los nuevos elementos y los integra. Wenn mehrere neue Elemente angelegt werden sollen, ist es daher sinnvoll, das Programm für diese Zeit in diesem Bearbeitungsmodus zu lassen, damit die Abarbeitung schneller ist. Las funciones "begin_modification" y "finish_modification" están disponibles para este propósito. En el ejemplo, se llama "begin_modification" antes de crear el primer nudo y "finish_modification" al final después de crear el caso de carga. Ambas funciones también se crearon como funciones de VBA en el programa. Die Funktionen sind eigenständig und daher werden innerhalb der Funktionen erneut die Variablen "request" und "response" angelegt. Sin embargo, como no se requieren elementos nuevos para esto, no se describirán más aquí. Interessant ist der Vergleich mit und ohne die Nutzung dieser Funktionen, welcher immer einen Geschwindigkeitsunterschied bringen wird.
Resumen
Die WebService-API ist ein mächtiges Werkzeug für RFEM und RSTAB. La transferencia simple basada en HTTP permite la implementación de la interfaz en muchos lenguajes de programación, no solo en VBA como se muestra aquí, y la programación multiplataforma es posible.
Autor

Dipl.-Ing. Thomas Günthel
Soporte técnico
El Sr. Günthel proporciona asistencia técnica a nuestros clientes.
Palabras clave
Enlaces
- Vistas 555x
- Actualizado 19. abril 2022
Contacte con nosotros
¿Tiene más preguntas o necesita un consejo? Póngase en contacto con nosotros por teléfono, correo electrónico, chat o foro, o encuentre soluciones sugeridas y consejos útiles en nuestra página de preguntas frecuentes disponible las 24 horas, los 7 días de la semana.

Nuevo
Optimización de parámetros en RFEM 6/RSTAB 9
Este artículo le mostrará cómo optimizar los parámetros globales en RFEM 6 según diferentes aspectos.