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")
The code above assumes that there is already a systemManager objects present in your AI code.
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
Both ways will be sufficient to make the TcCOM modules detectable by TwinCAT.
A TcCOM module is being identified by its GUID or name:
- This GUID can be used to add a TcCOM module to a TwinCAT configuration via the ITcSmTreeItem::CreateChild() method. The GUID can be determined in TwinCAT XAE via the properties page of a TcCOM module.
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"])
Please note that the vInfo parameter of the method ItcSmTreeItem::CreateChild() contains the GUID of the TcCOM module which is used to identify the module in the list of all registered TcCOM modules in that system.
- This name can be used to add a TcCOM module to a TwinCAT configuration via the ITcSmTreeItem::CreateChild() method. The name can be determined in TwinCAT XAE via the TMC Editor.
- This can be done by the following way:
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#):
ITcModuleManager2 moduleManager = (ITcModuleManager2)systemManager.GetModuleManager();
foreach (ITcModuleManager2 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;
Bitte beachten: 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().