NC-Achsen mit I/O oder PLC verknüpfen
Eine NC-Achse muss nach dem Anlegen mit einem I/O-Drive verbunden werden, damit sie auf Prozessdaten zugreifen kann. Dafür stehen zwei Varianten zur Verfügung. Variante 1 übergibt den Pfad zum I/O-Drive über ConsumeXml mit einem NcAxisDef-Element. TwinCAT wählt dabei automatisch passende PDO-Mappings. Variante 2 setzt die Verknüpfungen für einzelne Prozessvariablen explizit über ConsumeMappingInfo, was vollständige Kontrolle über das Mapping gibt.
Voraussetzungen
- Eine TwinCAT-Solution ist geöffnet und eine DTE-Verbindung ist aktiv.
ITcSysManagerwurde als COM-Objekt in einem STA-Thread initialisiert.- Eine NC-Achse ist unter
TINCangelegt (siehe MOT01 — NC-Achse anlegen). - Ein I/O-Device mit dem Ziel-Drive ist in der Konfiguration vorhanden.
Variante 1: Achse mit I/O-Drive verknüpfen
get_Child(1) liefert das erste Kind des TINC-Knotens, also die erste NC-Task. Der Achsenordner wird anschließend über LookupChild("Axes") aufgerufen. Das NcAxisDef-XML gibt den Pfad zum I/O-Drive und den Kanal an.
// Look up NC axis
ITcSmTreeItem ncConfig = sysManager.LookupTreeItem("TINC");
// LookupChild("Axes") is more reliable than a path string with a potential SAF suffix
ITcSmTreeItem axesFolder = ncConfig.get_Child(1).LookupChild("Axes");
ITcSmTreeItem ncAxis = axesFolder.LookupChild("Axis 1");
// Variant 1: link axis with I/O drive (source-verified)
string linkXml = @"<TreeItem>
<NcAxisDef>
<AxisType>1</AxisType>
<AxisIoType>CANopen-DS402</AxisIoType>
<IoItem>
<PathName>TIID^Device 1 (EtherCAT)^Term 1 (EK1100)^Drive 2 (AX8206-0000-0105)</PathName>
<Channel>0</Channel>
</IoItem>
</NcAxisDef>
</TreeItem>";
ncAxis.ConsumeXml(linkXml);
Variante 2: Einzelne Variablen explizit verknüpfen
ConsumeMappingInfo ist ab ITcSysManager3 verfügbar. Das Interface wird per Cast auf das bestehende sysManager-Objekt bezogen. Das XML-Format erwartet jeweils den vollständigen Baumpfad zu Achse und Drive sowie die Variablennamen beider Seiten.
// Variant 2: manually link individual variables (ConsumeMappingInfo)
// OwnerA = NC axis, OwnerB = I/O drive
string mappingXml = @"<VarLinks>
<OwnerA Name=""TICC^CNC^Axes^Axis_1"">
<OwnerB Name=""TIID^Device 1 (EtherCAT)^Drive 1 (AX5125-0000-0203)"">
<Link VarA=""Inputs^Drive status word"" VarB=""AT^Drive status word""/>
<Link VarA=""Inputs^Position feedback 1 value"" VarB=""AT^Position feedback 1 value""/>
<Link VarA=""Outputs^Master control word"" VarB=""MDT^Master control word""/>
<Link VarA=""Outputs^Position command value"" VarB=""MDT^Position command value""/>
</OwnerB>
</OwnerA>
</VarLinks>";
ITcSysManager3 sysMan3 = (ITcSysManager3)sysManager;
sysMan3.ConsumeMappingInfo(mappingXml);