Tutorial API usługi sieciowej w VBA
Artykuł o tematyce technicznej
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. Programy RFEM 6 i RSTAB 9 zapewniają interfejs oparty na tych wieloplatformowych usługach sieciowych. W tym tutorialu pokazano podstawy korzystania z języka programowania VBA.
Grundlagen Webservice API am Beispiel von VBA
Do sformatowania ciągu znaków wykorzystywany jest format XML zgodnie ze specyfikacjami protokołu SOAP. Jako przykład może posłużyć poniższe zapytanie:
<Koperta xmlns = "http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>
</Envelope>
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. Jednym z przykładów jest trzecia linia:
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
Jeśli istnieją podelementy, zaczyna się na "<", polecenie i "">", a kończy na "</", komendzie i "">". Właściwym przykładem jest sekcja "Body":
<Body>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>
Formatowanie ze spacjami i podziałami wierszy zostało użyte wyłącznie w celach ilustracyjnych. Nie jest to wymagane w przypadku transferu. Elementy "Body" i "Obwiednia" są elementami standardowymi do przenoszenia i są używane do każdego polecenia.
Wszystkie dostępne polecenia można odczytać za pomocą interfejsu WSDL. Es gibt Software, mit deren Hilfe daraus Listen erzeugt werden können. Jednym z takich programów jest SoapUI. Für die API von RFEM 6 gibt es zwei Listen, die Befehle für die Anwendung und die für das Modell. Obie listy można pobrać na końcu tego artykułu.
Ponieważ polecenia są przesyłane za pomocą protokołu HTTP, do adresowania wymagane są adresy URL. Domyślny adres aplikacji RSTAB/RFEM to "http://localhost: 8081/" i można go zmienić w ustawieniach w programie. Otwieranym modelom przydzielane są adresy w kolejności wzrastającej, dlatego pierwszy otwarty model posiada adres „http://localhost: 8082/”. Aby pobrać adres aktywnego modelu, wysyła się komendę "get_active_model". Odpowiednia odpowiedź z programu RFEM 6 wygląda tak:
<? wersja xml = "1.0"?>
<Koperta xmlns: mydło = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns: mydło-enc = "http://schemas.xmlsoap.org/soap/encoding/"
xmlns: xsd = "http://www.w3.org/2001/XMLSchema"
xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance">
<mydło:Ciało>
<n1: get_active_modelResponse
xmlns: n1 = "http://www.dlubal.com/rfem.xsd">
<wartość>
http://127.0.0.1:8082/
</value>
</a>getd_active_modelResponse>
</soap: Ciało>
</soap: Envelope>
Dodatkowe informacje w sekcji „Koperta” (niemiecki: Umschlag/Briefumschlag) sowie die vorangestellte Zeile "<?xml version="1.0"?>" sollen zunächst die verwendeten Standards aufzeigen und hier nicht weiter erörtert werden. W każdym razie widać, że elementy "Envelope" i "Body" są ponownie używane. Innerhalb von "Body" steckt die Antwort von RFEM 6 durch den Befehlsnamen "get_active_model" und dem angehängten Wort "Response". „Wartością”, czyli treścią tej odpowiedzi, jest adres aktywnego modelu. Ponadto program RFEM został zablokowany, aby umożliwić inny dostęp.
W poniższym przykładzie chcemy utworzyć pręt z dwiema podporami węzłowymi i obciążeniem. Aby móc komunikować się z programem RFEM za pomocą VBA, wymagane są następujące obiekty:
żądanie As MSXML2.XMLHTTP60
odpowiedź As 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. Odpowiedź może zostać przeanalizowana na podstawie dokumentu DOM. Poniższy przykład łączy pokazane wcześniej żądanie "get_active_model" z poleceniami używanymi w VBA:
' Uzyskaj aktywny adres URL modelu za pomocą polecenia "get_active_model"
str_envelope =
"<Koperta xmlns =" "http://schemas.xmlsoap.org/soap/koperta/" "> " & _
„<Bryła>” & _
"<get_active_model xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
„</Body>” & _
„</Koperta>”
'Otwórz i wyślij prośbę
request.Open "Post", "http://localhost: 8081/", False
request.Send (str_envelope)
' Uzyskaj odpowiedź i przekształć ją w obiekt xml
response.LoadXML (request.responseText)
Najpierw zapytanie jest zapisywane w formacie XML w zmiennej "str_envelope", a zapytanie jest otwierane w programie RFEM przy użyciu metody "Open" zmiennej "request". Zawartość zmiennej "str_envelope" można teraz wysłać przy użyciu metody "Send". Odpowiedź może być uzyskana za pomocą metody „Odpowiedź na tekst”. W tym konkretnym przypadku jest ona importowana bezpośrednio przy użyciu metody „LoadXML” zmiennej „odpowiedź”.
Zmienna "odpowiedź" typu DOMDocuments posiada metodę LoadXML i dzięki temu może rozpoznać formatowanie XML. Zaletą tego typu jest to, że typ DOMDocuments udostępnia również metodę GetElementsByTagName. Pozwala to na wyodrębnienie elementów bezpośrednio z kodu. Poniżej poprzedni kod został rozszerzony, tak aby dostępny był adres URL modelu:
' uzyskaj status http
status = prośba.status
Jeżeli status <> „200”, To
MsgBox "get_active_model: Wysłanie nie powiodło się - "; "; "; odpowiedź.Tekst
Zakończ Sub
End If
url_model = odpowiedź.GetElementsByTagName („wartość”) (0) .Text
Przed odczytaniem adresu URL można sprawdzić stan odpowiedzi. Są to ustandaryzowane kody stanu HTTP. Status „200” oznacza, że transfer został wykonany „OK”. Po tym zapytaniu adres URL modelu jest przechowywany w ciągu url_model. W tym celu w odpowiedzi XML wyszukuje się element „wartość”. Jeżeli odpowiedź składa się z kilku elementów, wszystkie wartości są przechowywane w sekcji „wartość”, dzięki czemu nie jest możliwa analiza za pomocą identyfikatora „wartość”, lecz podelementy „wartość” są uwzględnione. Dowiedz się więcej w praktycznym przykładzie. W przypadku adresu modelu jedyną zwracaną wartością jest adres URL, dlatego też "wartość" jest tu pomyślna.
Praktyczny przykład w VBA
Teraz, gdy znamy wszystkie podstawowe elementy, poniżej podano prosty przykład. Chcemy utworzyć belkę na dwóch słupach, do której można przyłożyć obciążenie prętowe.
Najpierw są definiowane i inicjowane zmienne opisane powyżej:
'zdefiniuj zmienne
Żądanie przyciemnienia As MSXML2.XMLHTTP60
Odpowiedź przygaszona As MSXML2.DOMDocument60
Dim str_envelope As String
Dim url_app As String
Dim url_model As String
' zmienne początkowe
Ustaw żądanie = Nowy MSXML2.XMLHTTP60
Ustaw odpowiedź = Nowy MSXML2.DOMDocument60
Z odpowiedzią
.async = Fałsz
.preserveWhiteSpace = False
.validateOnParse = False
.resolveExternals = False
' Korzystaj z pełnej funkcjonalności XPath
.SetProperty "SelectionLanguage", "XPath"
' Dodawanie określonych przestrzeni nazw do pracy ze ścieżkami
.SetProperty "SelectionNamespaces", "xmlns:soap =" "http://www.w3.org/2003/05/soap-envelope" "& _
"xmlns: xsd =" "http://www.dlubal.com/rfem.xsd" "& _
"xmlns: n1 ="" urna: schemas-microsoft-com: zestaw wierszy" "" & _
„xmlns =" "http://www.dlubal.com/rfem.xsd" ""
Zakończ na
url_app = "http://localhost: 8081/"
Oprócz zmiennych "request" i "response" tworzony jest ciąg znaków "str_envelope" dla żądania oraz "url_app" i "url_model" dla adresów aplikacji i modelu. Podczas inicjalizacji można przesłać znane specyfikacje protokołu SOAP w celu oceny formatowania XML odpowiedzi. Adres modelu zostanie pobrany później, ale należy podać adres aplikacji. Jak już wspomniano, należy wprowadzić domyślny adres „http://localhost: 8081/”.
Kolejnym krokiem jest przetestowanie połączenia z aplikacją. W tym celu standardowe informacje o aplikacji są odpytywane za pomocą polecenia "get_information":
' sprawdź adres URL aplikacji za pomocą polecenia "get_information"
str_envelope = "<Koperta xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" "> " & _
„<Bryła>” & _
"<get_information xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
„</Body>” & _
„</Koperta>”
'Otwórz i wyślij prośbę
request.Open "Post", url_app, False
request.Send (str_envelope)
' Uzyskaj odpowiedź i przekształć ją w obiekt xml
response.LoadXML (request.responseText)
' uzyskaj status http
status = prośba.Status
Jeżeli status <> „200”, To
MsgBox "get_information: Wysłanie nie powiodło się - "; "; "; odpowiedź.Tekst
Zakończ Sub
End If
' przeczytanie informacji o aplikacji
Dim str1 As String
str1 = ""
słowo1 = słowo1 i odpowiedź.GetElementsByTagName („nazwa”) (0) .Text i amp; vbLf
słowo1 = słowo1 i odpowiedź.GetElementsByTagName („typ”) (0) .Text i amp; vbLf
słowo1 = słowo1 i odpowiedź.GetElementsByTagName („wersja”) (0) .Text i amp; vbLf
str1 = str1 i odpowiedź.GetElementsByTagName („language_name”) (0) .Text i amp; vbLf
str1 = str1 i odpowiedź.GetElementsByTagName („language_id”) (0) .Text
MsgBox str1, vbInformation, "Odpowiedź na" "get_information" "request"
Jak już opisano w pierwszej części, żądanie w formacie XML jest przygotowywane i zapisywane w „str_envelope”. "Wniosek.Otwórz" otwiera połączenie z aplikacją. Słowo kluczowe „Poczta” oznacza wysłanie zapytania. Trzeci parametr ma wartość „prawda”, dzięki czemu realizowana jest transmisja synchroniczna. Następnie "request.Send" wysyła przygotowany ciąg znaków.
Po zakończeniu transferu, odpowiedź jest zapisywana w "odpowiedzi" i poprzez "zapytanie.Status" sprawdzana jest czy żądanie zostało wysłane. Der Status wird dabei von RFEM vergeben, sodass diese bei einer fehlerhaften Anfrage, zum Beispiel einem unbekannten Befehl, einen Fehler zurückgibt. Jeżeli status nie jest "200", program zostanie przerwany, a błąd zostanie wyświetlony w oknie (MsgBox).
Jeżeli nie wystąpiły błędy, możliwe jest odczytanie różnych przesłanych informacji za pomocą funkcji „GetElementsByTagName”. W konkretnym przykładzie informacje są następnie wyświetlane w oknie.
Poniższe elementy są bardzo podobne, dlatego opisane są tylko specjalne funkcje (kompletny kod źródłowy można pobrać). Aby ustawić belkę na dwóch słupach z obciążeniem prętowym, wymagane są następujące funkcje:
- Węzeł - set_node
- Linia - set_line
- Materiał - set_material
- Przekrój - zbiór_przekrój
- Pręt - zbiór_prętu
- Podpora węzłowa - set_nodal_support
- Parametry obliczeń - zestaw_ustawień_analizy_statycznej
- Przypadek obciążenia - set_load_case
- Obciążenie pręta - set_member_load
Podobnie jak większość innych funkcji, funkcja "set_node" ma wiele parametrów, ale zazwyczaj nie są one wymagane. Na wspomnianej już liście poleceń modelu RFEM widać różnorodność parametrów. Przede wszystkim istotne są parametry, które nie są oznaczone jako „opcjonalne”, ponieważ w każdym przypadku należy je uzupełnić. W tym przykładzie przenoszone są następujące parametry:
begin_modification (url_model)
' ustaw węzeł 1 na [0,00] za pomocą polecenia "set_node"
str_envelope =
"<Koperta xmlns =" "http://schemas.xmlsoap.org/soap/koperta/" "> " & _
„<Bryła>” & _
"<set_node xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
„<wartość xmlns =" „” ">” & _
„<no>1</no> i _
„<type> TYPE_STANDARD </type>” & _
„<współrzędna_1> 0 </współrzędna_1>” i _
„<współrzędna_2> 0 </współrzędna_2>” i _
„<współrzędna_3>0 </współrzędna_3>” i _
„</value>” & _
"</set_node> & _
„</Body>” & _
„</Koperta>”
Tylko numer węzła nie jest opcjonalny i można przydzielić resztę. Oprócz możliwych parametrów lista poleceń zawiera również zestawienia typów. W tym konkretnym przypadku dostępnych jest obecnie pięć różnych typów. Wybrano domyślny typ "TYPE_STANDARD". Pokazany tutaj pierwszy węzeł jest tworzony w lokalizacji (0; 0; 0), drugi węzeł (5,5; 0; 0). Wartości liczb dziesiętnych są wówczas następujące:
...
„<wartość xmlns =" „” ">” & _
„<no>2</no>” i _
„<type> TYPE_STANDARD </type>” & _
„<współrzędna_1>5,5 </współrzędna_1>” i _
„<współrzędna_2> 0 </współrzędna_2>” i _
„<współrzędna_3>0 </współrzędna_3>” i _
„</value>” & _
...
Listy to kolejna szczególna funkcja. Linia wymaga dwóch węzłów, których numery można przenieść w postaci listy. Elementy listy, takie jak „definition_nodes”, są oddzielone spacjami:
...
"<set_line xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
„<wartość xmlns =" „” ">” & _
„<no>1</no> i _
„<type> TYPE_POLYLINE </type>” i _
"<definicja_węzłów> 1 2 </definicja_węzły>" & _
„</value>” & _
„</set_line>” & _
...
Aby móc utworzyć pręt, należy utworzyć przekrój, do którego z kolei potrzebny jest materiał. Można korzystać z przekrojów i materiałów z wewnętrznej bazy danych. Dlatego wystarczy podać znany identyfikator. W przypadku materiału oznaczenie to „S235”, a przekrój ma nazwę „IPE 300”:
...
"<set_section xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
„<wartość xmlns =" „” ">” & _
„<no>1</no> i _
„<material>1 </material>” i _
„<type> TYPE_STANDARDIZED_STEEL </type>” & _
„<nazwa> IPE 300 </nazwa>” & _
„</value>” & _
"</set_section> & _
...
Aby sprawdzić, czy nazwa taka jak „IPE 300“ jest prawidłowa, można użyć wpisu w graficznym interfejsie użytkownika.
Aby wprowadzić sam pręt, nie jest wymagana wiedza, ale aby wprowadzić nieruchomą podporę, należy zdefiniować „nieskończoną“ sztywność sprężystą. Do transferu używane jest słowo kluczowe "INF":
...
"<set_nodal_support xmlns =" "http://www.dlubal.com/rfem.xsd" "> " & _
„<wartość xmlns =" „” ">” & _
„<no>1</no> i _
„<węzły>1 </węzły>” i _
„<wiosna_x>INF </i>wiosna x>&nz _
„<wiosna_y> INF </i>wiosna y> '
„<wiosna_z>INF </i>wiosna z>'
„<Ograniczenie_obrotowe_x>INF </i>ograniczenie_obrotowe_x>” & _
„<Ograniczenie_obrotowe_y> 0 </p>Ograniczenie_obrotowe_y> i _
„<rotacyjny_ograniczenie_z>INF </i>ograniczenie_obrotowe_z>” i _
„</value>” & _
"</set_nodal_support> & _
...
Tworzenie przypadku obciążenia i parametrów obliczeniowych nie wymaga dodatkowej wiedzy. Ostatnia osobliwość jest dodatkową wartością podczas tworzenia obciążenia, ponieważ musi zostać zdefiniowana poza obszarem "<wartość>". W przypadku obciążenia prętowego, należy tam przenieść odpowiedni przypadek obciążenia:
...
"<set_member_load xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<load_case_no xmlns =" "" ">1 </load_case_no>" & _
„<wartość xmlns =" „” ">” & _
„<no>1</no> i _
„<load_type> LOAD_TYPE_FORCE </load_type>” & _
„<członków>1 </empirycznych>” i _
"<load_distribution> LOAD_DISTRIBUTION_UNIFORM </load_distribution>" & _
"<Kierunek_ładowania> LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE </load_direction>" & _
„<magnituda> 1000 </magn.>” i _
„</value>” & _
"</set_member_load> & _
...
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.
Oprócz poprzednich funkcji tworzenia i eksportu danych, w tym miejscu prezentowane są dwie funkcje specjalne. Jeżeli elementy zostaną przeniesione do programu, program automatycznie przechodzi w tryb "Modyfikacji". Program sprawdza nowe elementy i integruje je. 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. W tym celu służą funkcje "begin_modification" i "finish_modification". W tym przykładzie „begin_modification” jest wywoływana przed utworzeniem pierwszego węzła, a „finish_modification” - na końcu po utworzeniu przypadku obciążenia. Obie funkcje zostały również utworzone jako funkcje VBA w programie. Die Funktionen sind eigenständig und daher werden innerhalb der Funktionen erneut die Variablen "request" und "response" angelegt. Ponieważ jednak nie są do tego potrzebne nowe elementy, nie będą one tutaj omawiane. Interessant ist der Vergleich mit und ohne die Nutzung dieser Funktionen, welcher immer einen Geschwindigkeitsunterschied bringen wird.
Podsumowanie
Die WebService-API ist ein mächtiges Werkzeug für RFEM und RSTAB. Prosty transfer oparty na protokole HTTP pozwala na zaimplementowanie interfejsu w wielu językach programowania, nie tylko w VBA, jak pokazano tutaj, dzięki czemu możliwe jest programowanie międzyplatformowe.
Autor

Dipl.-Ing. Thomas Günthel
Customer Support
Pan Günthel zapewnia wsparcie techniczne dla naszych klientów.
Słowa kluczowe
Linki
Skomentuj...
Skomentuj...
- Odwiedziny 406x
- Zaktualizowane 19. kwietnia 2022
Kontakt
Mają Państwo pytania lub potrzebują porady? Skontaktuj się z nami telefonicznie, mailowo, na czacie lub na forum lub znajdź sugerowane rozwiązania i przydatne wskazówki na stronie FAQ, dostępnej przez całą dobę.

Nowy
Uwzględnianie skrępowania przekrojów w analizie stateczności konstrukcji prętowych
Z tego artykułu dowiesz się, w jaki sposób można używać modułu dodatkowego Skrętowanie deformacyjne (7 stopni swobody) i stateczności konstrukcji w celu uwzględnienia spaczenia przekroju jako dodatkowego stopnia swobody podczas analizy stateczności.