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.

Beide Methoden werden nun im folgenden Artikel besprochen.

TwinCAT-Konfiguration durchsuchen 1:

LookupMethods

Die Lookup-Methoden betreffen immer das gesamte Datenmodell (ungefiltert).

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)

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.