Creating and handling Profinet devices

This article explains how to create and handle Profinet I/O devices via TwinCAT Automation Interface. The following topics are being discussed:

Creating Profinet devices

To create Profinet I/O devices (Controller/Device), the ITcSmTreeItem::CreateChild() method can be used. The Sub Type sets the actual type that should be added.

Name

Sub Type

Profinet Controller (RT)

113

Profinet Controller CCAT (RT)

140

Profinet Controller EL6631 (RT, EtherCAT)

119

Profinet Controller EL6632 (RT + IRT, EtherCAT)

126

Profinet Device (RT)

115

Profinet Device CCAT (RT)

142

Profinet Device CCAT (RT + IRT)

143

Profinet Device EL6631 (RT, EtherCAT)

118

Code Snippet (C#):

ITcSmTreeItem io = sysManager.LookupTreeItem("TIID");
ITcSmTreeItem profinetController = io.CreateChild("Profinet Controller", 113, null, null);

Code Snippet (Powershell):

$io = $sysManager.LookupTreeItem("TIID")
$profinetController = $io.CreateChild("Profinet Controller", 113, $null, $null)

Adding Profinet boxes

To create boxes below a Profinet device, the ITcSmTreeItem::CreateChild() may be used. The Sub Type depends on the box that should be added. The following table gives an overview about possible values:

Name

Sub Type

BK9102

9125

EK9300

9128

EL6631

9130

In addition some knowledge about the corresponding Profinet GSD file is required to use the vInfo parameter properly. The vInfo parameter is composed of the following syntax: PathToGSDfile#ModuleIdentNumber#BoxFlags#DAPNumber

The ModuleIdentNumber can be determined from within the GSD file, e.g. via the XML structure <ProfileBody><ApplicationProcess><DeviceAccessPointList><DeviceAccessPointItem ModuleIdentNumber>. The ModuleIdentNumber is usually unique. If not, the DAPNumber specifies the position in the DeviceAccessPointList.

The following BoxFlags are currently interpreted:

Name

Value

Description

GENERATE_NAME_FROM_PAB

0x0004

Profinet name will be generated via process image

GET_STATIONNAME

0x0400

Profinet name from TC config will be used (tree item name)

SET_NOT_IP_TO_OS

0x4000

CE-only: Profinet IP will not be registered in OS

Code Snippet (C#):

ITcSmTreeItem profinetEL6631 = profinetController.CreateChild("EL6631", 9130, null, "C:\\TwinCAT\\3.1\\Config\\Io\\Profinet\\GSDML-V2.31-beckhoff-EL6631-20140508.xml#0x3");

Code Snippet (Powershell):

$profinetEL6631 = $profinetController.CreateChild("EL6631", 9130, $null, "C:\\TwinCAT\\3.1\\Config\\Io\\Profinet\\GSDML-V2.31-beckhoff-EL6631-20140508.xml#0x3")

Adding Profinet modules

Profinet modules are created below the API node of a Profinet box. The API node is automatically created when adding a Profinet box to the TwinCAT configuration. To add Profinet modules the ITcSmTreeItem::CreateChild() method may be used. The SubType determines the position of the module within the <ProfileBody><ApplicationProcess><ModuleList> XML structure of the corresponding GSD file.

Code Snippet (C#):

ITcSmTreeItem profinetEL6631api = profinetEL6631.get_Child(1);
ITcSmTreeItem profinetModule1 = profinetEL6631api.CreateChild("", 30, null, null); // SubType 30 = 200 Byte In-Out
ITcSmTreeItem profinetModule2 = profinetEL6631api.CreateChild("", 12, null, null); // SubType 12 = 8 Byte In-Out
ITcSmTreeItem profinetModule3 = profinetEL6631api.CreateChild("", 8, null, null); // SubType 8 = 4 Byte Out

Code Snippet (Powershell):

$profinetEL6631api = $profinetEL6631.get_Child(1)
$profinetModule1 = $profinetEL6631api.CreateChild("", 30, $null, $null)
$profinetModule2 = $profinetEL6631api.CreateChild("", 12, $null, $null)
$profinetModule3 = $profinetEL6631api.CreateChild("", 8, $null, $null)

Adding Profinet Sub-Modules

Profinet Sub-Modules can be added below a so-called Profinet Modular Module. The handling is very similar to when adding regular Profinet modules. The Sub Type determines the position of the Sub-Module within the <ProfileBody><ApplicationProcess><ModuleList> XML structure of the corresponding GSD file.

Code Snippet (C#):

ITcSmTreeItem profinetModularModule = profinetEL6631api.CreateChild("", 98, null, null);    // SubType 98 = Modular
ITcSmTreeItem modularModule1 = profinetModularModule.CreateChild("", 12, null, null); // SubType 12 = 8 Byte In-Out
ITcSmTreeItem modularModule2 = profinetModularModule.CreateChild("", 14, null, null); // SubType 14 = 16 Byte Out
ITcSmTreeItem modularModule3 = profinetModularModule.CreateChild("", 31, null, null); // SubType 31 = 8 Word In

Code Snippet (Powershell):

$profinetModularModule = $profinetEL6631api.CreateChild("", 98, $null, $null) 
$modularModule1 = $profinetModularModule.CreateChild("", 12, $null, $null)
$modularModule2 = $profinetModularModule.CreateChild("", 14, $null, $null)
$modularModule3 = $profinetModularModule.CreateChild("", 31, $null, $null)