COM-Schnittstelle in VBA 4: Erstellen eines Werkzeuges

Fachbeitrag

Im dritten Teil 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 selektierten Knoten nichtlineare Knotenlager anlegt. Dazu sind folgende Kernelemente notwendig:

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

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

Aktuell selektierte Knoten holen

Das Bearbeiten selektierter Elemente über die COM-Schnittstelle erfolgt über die bereits bekannten Funktionen wie zum Beispiel IModelData.GetNodes für Knoten. Damit aber nur die selektierten Elemente zurückgegeben werden, muss zuvor über IModelData.EnableSelections auf die Bearbeitung der aktuellen Selektion umgeschaltet werden. Wenn EnableSelections auf 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 auf false gesetzt, da dies zu einer häufigen Fehlerquelle werden kann. Da das Knotenlager für die Definition eine Knotenliste als Zeichenkette benötigt, wird diese gleich im Anschluss erstellt:

' Liste der Knoten anlegen
Dim nodeList As String
Dim i As Long
For i = 0 To UBound(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 vorhanden ist. Daher muss zuerst ein Knotenlager nach den bekannten Prinzipien der vorigen Beiträ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 der Typ 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 entspricht dem Datensatz und die zweite Dimension den Elementen des Datensatzes. Hier ist das erste 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 dritte Punkt des Diagramms an der Stelle 30 mm und 0,2 kN ist. Diese Nichtlinearität muss nun dem vorhandenen Lager zugewiesen werden. Dazu wird das Interface zum Knotenlager und 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 AlongAxisZ gewä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 im Programmpfad abgeändert werden. Im Gegensatz zur Programmierung in C# und VB, wo eine ausführbare Datei erzeugt wird, muss bei VBA Excel für die Ausführung des Werkzeugs verwendet werden. Excel kann über ein Argument beim Start eine zu öffnende Datei zugewiesen werden. Dies würde in der Kommandozeile folgendermaßen aussehen, wobei die Excel-Datei unter C:\temp abgelegt und Excel als 32-Bit-Version installiert ist:
"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 externen Programms von RFEM nur ohne zusätzliche Argumente (wie in diesem Fall der Dateiname hinter 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ührbare EXE-Datei behandelt. Zum Erzeugen muss also zum Beispiel mit dem Editor eine TXT-Datei angelegt werden, welche nach der Erstellung die neue Dateiendung ".bat" erhält. Das Anzeigen der Dateiendung muss eventuell erst im Windows-Explorer eingestellt werden. Diese Batchdatei (im Folgenden EXCEL-Werzeug.bat) muss dann den folgenden Eintrag 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 externes Werkzeug 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 folgende Einträ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.xlsm auch unter C:/temp/ abgelegt werden.

Damit auch das Makro automatisch ausgeführt wird, muss die Subroutine in der von Excel beim Öffnen automatisch ausgeführte Subroutine gestartet werden. Diese Subroutine heiß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 bearbeitet werden können. Dafür wird noch eine Fallunterscheidung eingebaut. Die komplette Vorlage sieht wie folgt aus:

Private Sub Workbook_Open()

' Fehlerbehandlungsroutine Programmstart RFEM
On Error GoTo e

' Interface zu RFEM wird geholt
Dim iApp As RFEM5.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 vorhanden sind
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, Programmzugriff wieder möglich
   iModel.GetApplication.UnlockLicense
   ' Werkzeug soll Excel offen lassen, wenn ein Fehler auftritt
   Exit Sub
End If

' COM-Lizenz wird freigegeben, Programmzugriff wieder möglich
iModel.GetApplication.UnlockLicense
' Werkzeug soll Excel bei erfolgreicher Anwendung schließen
Application.Quit

End Sub

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

Zusammenfassung

Die Erstellung des nichtlinearen Knotenlagers ist eine Ergänzung zu den vorherigen Beiträgen, wohingegen das Anlegen eines externen Moduls Neuland ist. Das Einbinden ist bei der Verwendung ausführbarer Dateien, wie sie mit Hilfe von VisualStudio und VB beziehungsweise C# typischerweise erstellt werden, unproblematischer. Aus diesem 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