TwinCAT-Konfiguration durchsuchen
Wir haben bereits in einem getrennten Artikel beschrieben, wie man über das Visual Studio-Automatisierungsmodell auf TwinCAT zugreifen kann. Diese Referenz auf TwinCAT wird mit Hilfe eines Objekts vom Typ ITcSysManager repräsentiert. Wir würden im Folgenden gerne besprechen, wie Sie durch die TwinCAT-Konfiguration navigieren können.
Allgemeine Informationen
Es ist wichtig zu verstehen, dass die gesamte Information in TwinCAT in einer baumähnlichen Struktur geordnet ist. Im Automation Interface wird jeder Strukturknoten und demzufolge jedes Element einer TwinCAT-Konfiguration durch die ITcSmTreeItem-Schnittstelle dargestellt.
Es kann auf verschiedenen Wegen durch das TwinCAT-Datenmodell navigiert werden, und zwar abhängig davon, welche Art Information Sie abfragen möchten.
- Lookup-Methoden suchen nach spezifischen Tree Items über spezifizierte Suchkriterien, z.B. der Pfad zu einem Tree Item
- Iteratoren oder Suchfunktionen iterieren über einen Satz von abgefragten Tree Items
Beide Methoden werden nun im folgenden Artikel besprochen.
LookupMethods
Die Lookup-Methoden betreffen immer das gesamte Datenmodell (ungefiltert).
- ITcSysManager::LookupTreeItem bestimmt ein Tree Item mit dem angegebenen vollständigen Pfadnamen.
- ITcSysManager3::LookupTreeItemById bestimmt ein Tree Item mit angegebenem Elementtyp und Element-Id.
- ITcSmTreeItem::LookupChild bestimmt ein Tree Item innerhalb eines Unterbaums, der mit relativem Pfandnamen spezifiziert ist.
In TwinCAT kann jedes Tree Item mit Hilfe seines eindeutigen Pfadnamens identifiziert werden. Der Pfadname eines Tree Item basiert auf der hierarchischen Ordnung seines übergeordneten Elements (dessen Name) und seinem eigenen Namen, getrennt durch Zirkumflexe ('^'). Um die Pfadnamen zu verkürzen und Sprachabhängigkeiten zu vermeiden, haben die höchstrangigen Tree Items spezielle Kurzformen, die in ITcSysManager::LookupTreeItem aufgelistet sind.
Iteratoren
Derzeit werden drei verschiedene Arten von Iterationsfunktionen unterstützt.
- Alle Tree items durchsuchen (ungefiltert)
- Haupttree items durchsuchen
- Nur Variablen / Symbole durchsuchen
Alle Tree Items durchsuchen (ungefiltert)
Zum ungefilterten Durchsuchen aller Tree Items kann die Eigenschaft ITcSmTreeItem:NewEnum verwendet werden. _NewEnum iteriert über alle Unterknoten des aktuell referenzierten ITcSmTreeItem. Diese (COM-) Eigenschaft wird von vielen Programmier- und Scriptsprachen verwendet, die das COM Enumerator-Modell (z.B. .NET-Sprachen, VB6 oder Scriptsprachen) durch eine 'foreach'-Anweisung unterstützen. Bei Sprachen, die das nicht unterstützen, wie C++, muss die foreach-Schleife manuell implementiert werden unter Verwendung der IEnumVariant-Schnittstelle.
Wir empfehlen diese Vorgehensweise bei der Iteration durch untergeordnete Knoten.
Beispiel (C#):
ITcSmTreeItem parent = sysMan.LookupTreeItem("TIID^Device1^EK1100");
foreach(ITcSmTreeItem child in parent)
{
Console.WriteLine(child.Name);
}
Beispiel (C++):
...
#import "C:\TwinCAT3\Components\Base\TCatSysManager.tlb" // imports the System Manager / XAE Base type library
// uses automatically created auto-pointer (see MSDN documentation of #import command)
...
void CSysManDialog::IterateCollection(TCatSysManagerLib::ITcSmTreeItemPtr parentPtr)
{
IEnumVARIANTPtr spEnum = parentPtr->_NewEnum;
ULONG nReturned = 0;
VARIANT variant[1] = {0};
HRESULT hr = E_UNEXPECTED;
do
{
hr = spEnum->Next(1, &variant[0], &nReturned);
if(FAILED(hr))
break;
for(ULONG i = 0; i < nReturned; ++i)
{
IDispatchPtr dispatchPtr;
IDispatch* pDispatch;
TCatSysManagerLib::ITcSmTreeItemPtr childPtr;
HRESULT hr;
if(variant[0].vt == VT_DISPATCH)
{
TCatSysManagerLib::ITcSmTreeItem* pChild = 0;
dispatchPtr.Attach((variant[0].pdispVal));
hr = dispatchPtr.QueryInterface(__uuidof(TCatSysManagerLib::ITcSmTreeItem), reinterpret_cast(&pChild));
childPtr.Attach(pChild);
_bstr_t strName = pChild->GetName();
}
}
}
while(hr != S_FALSE); // S_FALSE zeigt Ende der Sammlung an
}
Beispiel (PowerShell):
$systemItem = $systemManager.LookupTreeItem("TIRC")
foreach($child in $systemItem)
{
write-host$child.Name
}
Haupttree items durchsuchen (gefiltert)
Zum ausschließlichen Durchsuchen der untergeordneten Hauptelemente des aktuellen Tree items verwenden Sie bitte das Eigenschaftenpaar ITcSmTreeItem::ChildCount und ITcSmTreeItem:Child(n). Diese Methoden wirken nur auf die direkten untergeordneten Elemente (nicht rekursiv).
Nur Variablen / Symbole durchsuchen
Zum Durchsuchen der Variablen / Symbole benutzen Sie das Eigenschaftenpaar ITcSmTreeItem::VarCount(x) , ITcSmTreeItem::Var(x,n). Der Variablentyp (Ein- oder Ausgangsvariablen) kann über Parameter festgelegt werden.