COM-Schnittstelle in VBA | 3. Erstellen eines Werkzeuges

Fachbeitrag

In Teil 2.2 der Beiträge dieser Serie wurde am Beispiel eines Stabes das Anlegen und Verändern von Kontenlagern, Lasten, Lastfällen, Lastkombinationen und Ergebniskombinationen gezeigt. Im nun vierten Teil soll es um das Anlegen eines selbst erstellten Werkzeuges gehen.

Bild 01 - Selbst erstelltes EXCEL-Werkzeug in RFEM

Grundlagen

Es soll ein Werkzeug erstellt werden, welches an den aktuell im Programm selektiertenKnoten nichtlineare Knotenlager anlegt. Dazu sind folgende Kernelemente notwendig:

  • aktuell selektierte Knoten holen
  • Knotenlager anlegen
  • Nichtlinearitätanlegen und zuweisen
  • Werkzeug im Programm erzeugen

Im Folgenden sollen diese Punkte abgearbeitet werden. Dafür ist das Wissen aus denvorangegangenen Beiträgen erforderlich und wird nicht nochmal behandelt. Im verfügbarenQuellcode werden aber bereits erwähnte Elemente wie zum Beispiel das Holen der Strukturin Kommentaren knapp dokumentiert.

Aktuell selektierte Knoten holen

Das Bearbeiten selektierter Elemente über die COM-Schnittstelle erfolgt über diebereits bekannten Funktionen wie zum Beispiel IModelData.GetNodes für Knoten. Damitaber nur die selektierten Elemente zurückgegeben werden, muss zuvor über IModelData.EnableSelectionsauf die Bearbeitung der aktuellen Selektion umgeschaltet werden. Wenn EnableSelectionsauf True gesetzt ist, gibt IModelData.GetNodes nur die selektierten Elemente zurück.Hier das konkrete Beispiel:

' selektierte Knoten holen
iModDat.EnableSelections True ' nur mit selektierten Objekten arbeiten
Dim nodes() As RFEM5.Node
nodes = iModDat.GetNodes
iModDat.EnableSelections False ' wieder mit allen Objekten arbeiten

Nachdem die selektierten Knoten geholt wurden, wird EnableSelections wieder auffalse gesetzt, da dies zu einer häufigen Fehlerquelle werden kann. Da das Knotenlagerfür die Definition eine Knotenliste als Zeichenkette benötigt, wird diese gleichim Anschluss erstellt:

' Liste der Knoten anlegen
Dim nodeList As String
DimAsLong
For i = 0 ToUBound(nodes, 1)
   nodeList = nodeList & nodes(i).No & ","
Next i

Knotenlager anlegen

Die Nichtlinearität, im konkreten Fall das Diagramm, ist ein separates Element.Es kann einem Knotenlager erst zugewiesen werden, wenn dies bereits im System vorhandenist. Daher muss zuerst ein Knotenlager nach den bekannten Prinzipien der vorigenBeiträge angelegt werden:

' Knotenlager anlegen
Dim nodSup As RFEM5.NodalSupport
nodSup.No = 100
nodSup.IsColumn = False
nodSup.IsValid = True
nodSup.nodeList = nodeList
nodSup.ReferenceSystem = GlobalSystemType

nodSup.RestraintConstantX = 0.01
nodSup.RestraintConstantY = 0.01
nodSup.RestraintConstantZ = 0.01

nodSup.SupportConstantX = -1
nodSup.SupportConstantY = -1
nodSup.SupportConstantZ = -1

' Nichtlinearität definieren
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

Wie im Code zu erkennen ist, wird in globaler z-Richtung als Nichtlinearität derTyp WorkingDiagramType angegeben.

Nichtlineares Lager anlegen und zuweisen

Nachdem das Knotenlager auf die Nichtlinearität WorkingDiagramType vorbereitet wurde,muss diese nun erzeugt werden:

' Nichtlinearität erstellen
Dim nldgrm As RFEM5.NonlinearityDiagram

nldgrm.ForceType = StiffnessDiagramForceType.NoneStiffnessForce
nldgrm.PositiveZoneType = DiagramAfterLastStepType.StopDiagramType
nldgrm.Symmetric = True

' Diagramm erstellen
ReDim nldgrm.PositiveZone(3, 1)
nldgrm.PositiveZone(0, 0) = 0#
nldgrm.PositiveZone(0, 1) = 0#

nldgrm.PositiveZone(1, 0) = 0.01
nldgrm.PositiveZone(1, 1) = 100

nldgrm.PositiveZone(2, 0) = 0.03
nldgrm.PositiveZone(2, 1) = 200

nldgrm.PositiveZone(3, 0) = 0.05
nldgrm.PositiveZone(3, 1) = 300

Das Diagramm besteht aus einem zweidimensionalen Feld. Die erste Dimension entsprichtdem Datensatz und die zweite Dimension den Elementen des Datensatzes. Hier ist daserste Element im Datensatz die Verschiebung in m und das Zweite die Kraft in N.Das obige Beispiel erstellt somit vier Datensätze, bei dem zum Beispiel der drittePunkt des Diagramms an der Stelle 30 mm und 0,2 kN ist. Diese Nichtlinearität mussnun dem vorhandenen Lager zugewiesen werden. Dazu wird das Interface zum Knotenlagerund danach zur Nichtlinearität geholt:

' Nichtlinearität zuweisen
Dim iNodSup As RFEM5.INodalSupport
Set iNodSup = iModDat.GetNodalSupport(100,ItemAt.AtNo)
Dim iNldiag As RFEM5.INonlinearityDiagram
Set iNldiag = iNodSup.GetNonlinearity(AlongAxisZ)

iModDat.PrepareModification
iNldiag.SetData nldgrm
iModDat.FinishModification

Die Nichtlinearität ist hier entlang der Z-Achse und daher muss beim Holen AlongAxisZgewählt werden. Die Zuweisung erfolgt im bekannten Modification Block.

Werkzeug im Programm erzeugen

Es ist in RFEM möglich, externe Programme einzubinden. Dazu muss die RFEM.ini imProgrammpfad abgeändert werden. Im Gegensatz zur Programmierung in C# und VB, woeine ausführbare Datei erzeugt wird, muss bei VBA Excel für die Ausführung des Werkzeugsverwendet werden. Excel kann über ein Argument beim Start eine zu öffnende Dateizugewiesen werden. Dies würde in der Kommandozeile folgendermaßen aussehen, wobeidie Excel-Datei unter C:\temp abgelegt und Excel als 32-Bit-Version installiertist:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabelle1.xlsm

Damit wird Excel mit der gewünschten Datei geöffnet. Da der Aufruf eines externenProgramms von RFEM nur ohne zusätzliche Argumente (wie in diesem Fall der Dateinamehinter EXCEL.EXE) erfolgen kann, muss noch eine Windows-Batch-Datei erzeugt werden.Diese einfache Textdatei mit der Dateiendung ".bat" wird von Windows wie eine ausführbareEXE-Datei behandelt. Zum Erzeugen muss also zum Beispiel mit dem Editor eine TXT-Dateiangelegt werden, welche nach der Erstellung die neue Dateiendung ".bat" erhält.Das Anzeigen der Dateiendung muss eventuell erst im Windows-Explorer eingestelltwerden. Diese Batchdatei (im Folgenden EXCEL-Werzeug.bat) muss dann den folgendenEintrag haben:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabelle1.xlsm
Dies entspricht dem Kommando, wie es in der Kommandozeile eingegeben werden würde.

Nach der Erstellung dieser ausführbaren Datei kann diese in die RFEM.ini als externesWerkzeug eingetragen werden. Die RFEM.ini befindet sich im Programmpfad von RFEM(Standard für RFEM 5.07 64-Bit: C:\Program Files\Dlubal\RFEM 5.07). Dort sind folgendeEinträge zu ergänzen:

ModuleName2=EXCEL-Werkzeug
ModuleExeName2="c:\temp\EXCEL-Werkzeug.bat"
ModuleDescription2=Nichtlineares Stabendgelenk

Natürlich müssen dann die Batchdatei EXCEL-Werkzeug.bat und das Makro tabelle1.xlsmauch unter C:/temp/ abgelegt werden.

Damit auch das Makro automatisch ausgeführt wird, muss die Subroutine in der vonExcel beim Öffnen automatisch ausgeführte Subroutine gestartet werden. Diese Subroutineheißt Workbook_Open und muss im Workbook abgelegt werden.

Bild 02- Subroutine Workbook_Open in Workbook

Jetzt fehlt noch, dass Excel nach dem erfolgreichen Ausführen wieder beendet wird.Falls ein Fehler auftritt oder RFEM nicht geöffnet ist, soll das Makro bearbeitetwerden können. Dafür wird noch eine Fallunterscheidung eingebaut. Die kompletteVorlage sieht wie folgt aus:

Private SubWorkbook_Open()

' Fehlerbehandlungsroutine Programmstart RFEM
On Error GoTo e

' Interface zu RFEM wird geholt
Dim iApp AsRFEM5.Application
Set iApp = GetObject(, "RFEM5.Application")

e: ' bei einem Fehler wird "RFEM not open" ausgegeben
If Err.Number <> 0 Then
   MsgBox "RFEM not open", , Err.Source
   Exit Sub
End If

' Fehlerbehandlungsroutine Programm
On Error GoTo f

' COM-Lizenz und Programmzugriff werden gesperrt
iApp.LockLicense

' Interface für aktives Modell holen
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
   Set iModel = iApp.GetActiveModel
Else
' Fehler werfen, wenn nicht genügend Modelle vorhandensind
Err.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"
End If

' Platz für eigenen Quellcode

f: ' Fehler aus Quellcode abfangen
If Err.Number <> 0 Then
   MsgBox Err.Description, , Err.Source
   ' COM-Lizenz wird freigegeben, Programmzugriffwieder möglich
   iModel.GetApplication.UnlockLicense
   ' Werkzeug soll Excel offen lassen,wenn ein Fehler auftritt
   Exit Sub
End If

' COM-Lizenz wird freigegeben, Programmzugriff wiedermöglich
iModel.GetApplication.UnlockLicense
' Werkzeug soll Excel bei erfolgreicher Anwendungschließen
Application.Quit

End Sub

Hier fehlt nun lediglich der Verweis auf die vorhin erstellte Subroutine, welcheunter "Platz für eigenen Quellcode" platziert wird. Der komplette Quellcode istim nachfolgenden Link erhältlich.

Zusammenfassung

Die Erstellung des nichtlinearen Knotenlagers ist eine Ergänzung zu den vorherigenBeiträgen, wohingegen das Anlegen eines externen Moduls Neuland ist. Das Einbindenist bei der Verwendung ausführbarer Dateien, wie sie mit Hilfe von VisualStudiound VB beziehungsweise C# typischerweise erstellt werden, unproblematischer. Ausdiesem Grund wurde hier der komplexere Vorgang mit Excel beschrieben.

Links

Kontakt

Kontakt zu Dlubal

Haben Sie Fragen oder brauchen Sie einen Rat? Kontaktieren Sie uns oder nutzen Sie die häufig gestellten Fragen (FAQs) rund um die Uhr.

+49 9673 9203 0

info@dlubal.com

RFEM Hauptprogramm
RFEM 5.xx

Basisprogramm

Das FEM-Programm RFEM ermöglicht die schnelle und einfache Modellierung, Berechnung und Bemessung von Tragkonstruktionen mit Stab-, Platten-, Scheiben-, Faltwerk-, Schalen- und Volumen-Elementen aus verschiedenen Materialien.

Erstlizenzpreis
3.540,00 USD
RFEM Sonstige
RF-COM 5.xx

Zusatzmodul

Programmierbare COM-Schnittstelle

Erstlizenzpreis
580,00 USD