Erstellung von und Umgang mit TcCOM Modulen
In diesem Kapitel wird beschrieben, wie bestehende TcCOM-Module einer bestehenden TwinCAT-Konfiguration hinzugefügt werden und diese parametrisiert werden. Die folgenden Themen werden in diesem Kapitel kurz behandelt:
- Erwerb einer Referenz zu “TcCOM Objects” Knoten
- TcCOM-Module hinzufügen
- Durch hinzugefügte TcCOM-Module iterieren
- CreateSymbol Flag für Parameter einstellen
- CreateSymbol Flag für Datenbereiche einstellen
- Kontext (Aufgaben) einstellen
- Variablen verknüpfen
Erwerb einer Referenz zu “TcCOM Objects” Knoten
In einer TwinCAT-Konfiguration befindet sich der “TcCOM Objects” Knoten unter “SYSTEM^TcCOM Objects”. Daher können Sie eine Referenz zu diesem Knoten erfassen, indem Sie die Methode ITcSysManager::LookupTreeItem() auf folgende Weise verwenden:
Code-Ausschnitt (C#):
ITcSmTreeItem tcComObjects = systemManager.LookupTreeItem("TIRC^TcCOM Objects");Code-Ausschnitt (Powershell):
$tcComObjects = $systemManager.LookupTreeItem("TIRC^TcCOM Objects")Adding existing TcCOM modules
Der vorstehende Code geht davon aus, dass bereits ein SystemManager Objekt in Ihrem AI-Code vorhanden ist.
TcCOM-Module hinzufügen
Um bestehende TcCOM-Module zu Ihrer TwinCAT-Konfiguration hinzufügen, müssen diese Module für TwinCAT erkennbar sein. Dies kann durch eine der folgenden Vorgehensweisen erreicht werden:
- TcCOM-Module zum Ordner %TWINCAT3.XDIR”\CustomConfig\Modules\ kopieren.
- %TWINCAT3.XDIR”\Config\Io\TcModuleFolders.xml bearbeiten, um einen Pfad zu einem Ordner Ihrer Wahl hinzuzufügen und die Module innerhalb dieses Ordners zu platzieren.
Beide Vorgehensweisen reichen aus, um die TcCOM-Module für TwinCAT erkennbar zu machen.
Ein TcCOM-Modul wird anhand seiner GUID oder seines Namens identifiziert:
- Diese GUID kann verwendet werden, um ein TcCOM-Modul über die Methode ITcSmTreeItem::CreateChild() zu einer TwinCAT-Konfiguration hinzuzufügen. Die GUID lässt sich in TwinCAT XAE über die Eigenschaftenseite eines TcCOM-Moduls ermitteln.

Alternativ können Sie die GUID über die TMC-Datei des TcCOM-Moduls bestimmen.
<TcModuleClass>
<Modules>
<Module GUID="{8f5fdcff-ee4b-4ee5-80b1-25eb23bd1b45}">
...
</Module>
</Modules>
</TcModuleClass>Angenommen, wir verfügen bereits über ein TcCOM-Modul, das in TwinCAT registriert ist und für TwinCAT erkennbar ist. Wir möchten nun dieses TcCOM-Modul, das den GUID {8F5FDCFF-EE4B-4EE5-80B1-25EB23BD1B45} hat, zur TwinCAT-Konfiguration hinzufügen. Dies kann wie folgt geschehen:
Code-Ausschnitt (C#):
Dictionary<string,Guid> tcomModuleTable = new Dictionary<string,Guid>();
tcomModuleTable.Add("TempContr",Guid.Parse("{8f5fdcff-ee4b-4ee5-80b1-25eb23bd1b45}"));
ITcSmTreeItem tempController = tcComObjects.CreateChild("Test", 0, "", tcomModuleTable["TempContr"]);Code-Ausschnitt (Powershell):
$tcomModuleTable = @{}
$tcomModuleTable.Add("TempContr", "{8f5fdcff-ee4b-4ee5-80b1-25eb23bd1b45}")
$tempController = $tcComObjects.CreateChild("Test", 0, "", $tcomModuleTable["TempContr"])Bitte beachten Sie, dass der Parameter „vInfo“ der Methode „ItcSmTreeItem::CreateChild()“ die GUID des TcCOM-Moduls enthält, anhand derer das Modul in der Liste aller registrierten TcCOM-Module in diesem System identifiziert wird.
- Dieser Name kann verwendet werden, um über die Methode ITcSmTreeItem::CreateChild() ein TcCOM-Modul zu einer TwinCAT-Konfiguration hinzuzufügen. Der Name kann in TwinCAT XAE über den TMC-Editor ermittelt werden.

- Dies lässt sich auf folgende Weise bewerkstelligen:
Code Snippet (C#):
ITcSmTreeItem tempController = tcComObjects.CreateChild("Test", 1, "", "NewModule");Code Snippet (Powershell):
$tempController = $tcComObjects.CreateChild("Test", 0, "", "NewModule")Durch hinzugefügte TcCOM-Module iterieren
Zur Iteration durch alle hinzugefügte TcCOM-Modulinstanzen können Sie die ITcModuleManager2 Schnittstelle verwenden. Der folgende Code-Ausschnitt zeigt, wie Sie diese Schnittstelle verwenden.
Code-Ausschnitt (C#):
ITcSysManager15 sysManager15 = sysManager as ITcSysManager15;
ITcModuleManager3 moduleManager = sysManager15.GetModuleManager() as ITcModuleManager3;
foreach (ITcModuleInstance2 moduleInstance in moduleManager)
{
string moduleType = moduleInstance.ModuleTypeName;
string instanceName = moduleInstance.ModuleInstanceName;
Guid classId = moduleInstance.ClassID;
uint objId = moduleInstance.oid;
uint parentObjId = moduleInstance.ParentOID;
}Code-Ausschnitt (Powershell):
$moduleManager = $systemManager.GetModuleManager()
ForEach( $moduleInstance in $moduleManager )
{
$moduleType = $moduleInstance.ModuleTypeName
$instanceName = $moduleInstance.ModuleInstanceName
$classId = $moduleInstance.ClassID
$objId = $moduleInstance.oid
$parentObjId = $moduleInstance.ParentOID
}Denken Sie daran, dass jedes Modulobjekt ebenfalls als ein ITcSmTreeItem interpretiert werden kann, daher wäre die folgende Typumwandlung gültig:
Code-Ausschnitt (C#):
ITcSmTreeItem treeItem = moduleInstance As ITcSmTreeItem;![]() | Powershell verwendet standardmäßig dynamische Datentypen. |
CreateSymbol Flag für Parameter einstellen
Das CreateSymbol (CS) Flag für Parameter eines TcCOM-Moduls kann über ihre XML-Beschreibung eingestellt werden. Der folgende Code-Ausschnitt zeigt, wie das CS Flag für den Parameter „CallBy“ aktiviert wird.
Code-Ausschnitt (C#):
bool activateCS = true;
// First step: Read all Parameters of TcCOM module instance
string tempControllerXml = tempController.ProduceXml();
XmlDocument tempControllerDoc = new XmlDocument();
tempControllerDoc.LoadXml(tempControllerXml);
XmlNode sourceParameters = tempControllerDoc.SelectSingleNode("TreeItem/TcModuleInstance/Module/Parameters");
// Second step: Build target XML (for later ConsumeXml())
XmlDocument targetDoc = new XmlDocument();
XmlElement treeItemElement = targetDoc.CreateElement("TreeItem");
XmlElement moduleInstanceElement = targetDoc.CreateElement("TcModuleInstance");
XmlElement moduleElement = targetDoc.CreateElement("Module");
XmlElement parametersElement = (XmlElement) targetDoc.ImportNode(sourceParameters, true);
moduleElement.AppendChild(parametersElement);
moduleInstanceElement.AppendChild(moduleElement);
treeItemElement.AppendChild(moduleInstanceElement);
targetDoc.AppendChild(treeItemElement);
// Third step: Look for specific parameter (in this case "CallBy") and read its CreateSymbol attribute
XmlNode destModule = targetDoc.SelectSingleNode("TreeItem/TcModuleInstance/Module");
XmlNode callByParameter = destParameters.SelectSingleNode("Parameters/Parameter[Name='CallBy']");
XmlAttribute createSymbol = callByParameter.Attributes["CreateSymbol"];
createSymbol.Value = "true";
// Fifth step: Write prepared XML to configuration via ConsumeXml()
string targetXml = targetDoc.OuterXml;
tempController.ConsumeXml(targetXml);Code-Ausschnitt (Powershell):
$tempControllerXml = [Xml]$tempController.ProduceXml()
$sourceParameters = $tempControllerXml.TreeItem.TcModuleInstance.Module.Parameters
[System.XML.XmlDocument] $targetDoc = New-Object System.XML.XmlDocument
[System.XML.XmlElement] $treeItemElement = $targetDoc.CreateElement("TreeItem")
[System.XML.XmlElement] $moduleInstanceElement = $targetDoc.CreateElement("TcModuleInstance")
[System.XML.XmlElement] $moduleElement = $targetDoc.CreateElement("Module")
[System.XML.XmlElement] $parametersElement = $targetDoc.ImportNode($sourceParameters, $true)
$moduleElement.AppendChild($parametersElement)
$moduleInstanceElement.AppendChild($moduleElement)
$treeItemElement.AppendChild($moduleInstanceElement)
$targetDoc.AppendChild($treeItemElement)
$destModule = $targetDoc.TreeItem.TcModuleInstance.Module
$callByParameter = $destmodule.SelectSingleNode("Parameters/Parameter[Name='CallBy']")
$callByParameter.CreateSymbol = "true"
$targetXml = $targetDoc.OuterXml
$tempController.ConsumeXml($targetXml)CreateSymbol Flag für Datenbereiche einstellen
Das CreateSymbol (CS) Flag für Datenbereiche eines TcCOM-Moduls kann über ihre XML-Beschreibung eingestellt werden. Der folgende Code-Ausschnitt zeigt, wie das CS Flag für den Datenbereich „Input“ aktiviert wird. Es sei darauf hingewiesen, dass dieses Verfahren dem für Parameter sehr ähnlich ist.
Code-Ausschnitt (C#):
bool activateCS = true;
// First step: Read all Data Areas of a TcCOM module instance
string tempControllerXml = tempController.ProduceXml();
XmlDocument tempControllerDoc = new XmlDocument();
tempControllerDoc.LoadXml(tempControllerXml);
XmlNode sourceDataAreas = tempControllerDoc.SelectSingleNode("TreeItem/TcModuleInstance/Module/DataAreas");
// Second step: Build target XML (for later ConsumeXml())
XmlDocument targetDoc = new XmlDocument();
XmlElement treeItem = targetDoc.CreateElement("TreeItem");
XmlElement moduleInstance = targetDoc.CreateElement("TcModuleInstance");
XmlElement module = targetDoc.CreateElement("Module");
XmlElement dataAreas = (XmlElement)
targetDoc.ImportNode(sourceDataAreas, true);
module.AppendChild(dataAreas);
moduleInstance.AppendChild(module);
treeItem.AppendChild(moduleInstance);
targetDoc.AppendChild(treeItem);
// Third step: Look for specific Data Area (in this case "Input") and read its CreateSymbol attribute
XmlElement dataArea = (XmlElement)targetDoc.SelectSingleNode("TreeItem/TcModuleInstance/Module/DataAreas/DataArea[ContextId='0' and Name='Input']");
XmlNode dataAreaNo = dataArea.SelectSingleNode("AreaNo");
XmlAttribute createSymbol = dataAreaNoNode.Attributes["CreateSymbols"];
// Fourth step: Set CreateSymbol attribute to true if it exists. If not, create attribute and set its value
if (createSymbol != null)
string oldValue = createSymbol.Value;
else
{
createSymbol = targetDoc.CreateAttribute("CreateSymbols");
dataAreaNo.Attributes.Append(createSymbol);
}
createSymbol.Value = XmlConvert.ToString(activateCS);
// Fifth step: Write prepared XML to configuration via ConsumeXml()
string targetXml = targetDoc.OuterXml;
tempController.ConsumeXml(targetXml);Code-Ausschnitt (Powershell):
$tempControllerXml = [Xml]$tempController.ProduceXml()
$sourceDataAreas = $tempControllerXml.TreeItem.TcModuleInstance.Module.DataAreas
[System.XML.XmlDocument] $targetDoc = New-Object System.XML.XmlDocument
[System.XML.XmlElement] $treeItem = $targetDoc.CreateElement("TreeItem")
[System.XML.XmlElement] $moduleInstance = $targetDoc.CreateElement("TcModuleInstance")
[System.XML.XmlElement] $module = $targetDoc.CreateElement("Module")
[System.XML.XmlElement] $dataAreas = $targetDoc.ImportNode($sourceDataAreas, $true)
$module.AppendChild($dataAreas)
$moduleInstance.AppendChild($module)
$treeItem.AppendChild($moduleInstance)
$targetDoc.AppendChild($treeItem)
$destModule = $targetDoc.TreeItem.TcModuleInstance.Module
[System.XML.XmlElement] $dataArea = $destModule.SelectSingleNode("DataAreas/DataArea[ContextId='0' and Name='Input']")
$dataAreaNo = $dataArea.SelectSingleNode("AreaNo")
$dataAreaNo.CreateSymbols = "true"
// Fifth step: Write prepared XML to configuration via ConsumeXml()
$targetXml = $targetDoc.OuterXml
$tempController.ConsumeXml($targetXml)Kontext (Aufgaben) einstellen
Jede TcCOM-Modulinstanz muss in einem spezifischen Kontext (Aufgabe) laufen. Dies kann über die ITcModuleInstance2::SetModuleContext() Methode erfolgen. Diese Methode erwartet zwei Parameter: ContextId und TaskObjectId. Beide sind äquivalent zu den entsprechenden Parametern in TwinCAT XAE:

Denken Sie daran, dass die TaskObjectId in TwinCAT XAE hexadezimal wiedergegeben wird.
Code-Ausschnitt (C#):
ITcModuleInstance2 tempControllerMi = (ITcModuleInstance2) tempController;
tempControllerMi.SetModuleContext(0, 33619984);Sie können die TaskObjectId über die XML-Beschreibung der entsprechenden Aufgabe bestimmen, z. B.:
Code-Ausschnitt (C#):
ITcSmTreeItem someTask = systemManager.LookupTreeItem("TIRT^SomeTask");
string someTaskXml = someTask.ProduceXml();
XmlDocument someTaskDoc = new XmlDocument();
someTaskDoc.LoadXml(someTaskXml);
XmlNode taskObjectIdNode = someTaskDoc.SelectSingleNode("TreeItem/ObjectId");
string taskObjectIdStr = taskObjectId.InnerText;
uint taskObjectId = uint.Parse(taskObjectIdStr, NumberStyles.HexNumber);Variablen verknüpfen
Die Verknüpfung von Variablen einer TcCOM-Modulinstanz zu SPS/IO oder anderen TcCOM-Modulen kann vorgenommen werden, indem die regulären Mechanismen des Automation Interface verwendet werden, z. B. ITcSysManager::LinkVariables().
