PNS I&M Example

1. Example project

In this example the application shall handle I&M data on the application side. For that, it is necessary to change the configuration packet, to implement "Write I&M indication“, "Read I&M indication" and "Reset to factory indication". For that, the application needs a possibility to save information remanent in a flash.

The extendedConfig example can be found in the Knowledge Base on the following website:

netX 90: https://hilscher.atlassian.net/wiki/display/NXLFWHST/netX+90+-+PROFINET+IO+Device+-+Examples



This can alternatively be found under:

kb.hilscher.com → Software → LFW Host Examples → Profinet IO-Device → netX 90 APP / netX 51 → PROFINET IO Device - extendedConfig Vx.x.x.x

The extendedConfig project can be opened by double-clicking the ".solproject" file. This requires the latest version of netXStudio (https://hilscher.atlassian.net/wiki/display/NDT/).


2. PROFINET Sources

A GSDML file is required for this example. The GSDML file can be found in the netXStudio project in Project Explorer at:

netXxx_PNSVx_extendedConfig → Components → cifXApplicationDemoPNS → DeviceDescription → GSDML-V2.3x-HILSCHER-NETX xx-RE PNS-20xxxxxx.xml


The PacketHandler describes the acyclic packages and can be found in the Project Explorer under:

netXxx_PNSVx_extendedConfig → Components → cifXApplicationDemoPNS → Sources → AppPNS_DemoApplicationFunctions.c


The IO Data Handler describes the IO data that is exchanged between the application and the stack and can be found in the Project Explorer under:

    long SetModulConfig( void* pvPck )


The terminal handler uses the interface used by UART to display debug messages and is located in Project Explorer under:

netXxx_PNSVx_extendedConfig → Components → cifXApplicationDemo → Sources → App_TerminalHandler.c


The event handler shows the diagnoses and alarms, which can be found in the Project Explorer under:

netXxx_PNSVx_extendedConfig → Components → cifXApplicationDemo → Sources → App_EventHandler.c


3. Configuration packet

In the configuration packet, it is necessary to change the ptSetConfig → ulSystemFlags.

First step is to disable the flag PNS_IF_SYSTEM_STACK_HANDLE_I_M_ENABLED.



The next step is the use of the same data in the configuration packet like in the I&M0 information.

You can for example first create a structure of I&M0 and then use it:

ptSetConfig → ulVendorId              = IM0.usManufacturerId;

ptSetConfig → usSwRevision1       = IM0.tSoftwareRevision.bX;

ptSetConfig → usSwRevision2       = IM0.tSoftwareRevision.bY;

ptSetConfig → usSwRevision3       = IM0.tSoftwareRevision.bZ;

ptSetConfig → bSwRevisionPrefix  = IM0.tSoftwareRevision.bPrefix;


4. Values from GSDML file

In the GSDML the device, the developer needs to give information about which module has I&M data. Below you see the default configuration in our PNS V5.1.0.4 device.

I&M is currently just configured for the DAP:


<VirtualSubmoduleItem ID="DIM 31" IM5_Supported="false" MayIssueProcessAlarm="false" SubmoduleIdentNumber="0x00003010" Writeable_IM_Records="1 2 3">


That means, I&M0 is supported to 3. I&M4 and 5 is not supported. Only the DAP module has I&M Data.


It is possible to use Writeable_IM_Records="1 2 3 4" on a different module. For example:


<VirtualSubmoduleItem ID="10byteinput" MayIssueProcessAlarm="false" SubmoduleIdentNumber="0x00000001" Writeable_IM_Records="1 2">


That means the DAP has now I&M0 to 3 and the 10 Byte Input module has its dataset for I&M0 to 2.

In this case, the I&M data handling needs to be implemented in your application because the stack can only handle the default I&M data on the DAP.


5. Indications

Implement the packet handler Indications for

  • PNS_IF_READ_IM_IND
  • PNS_IF_WRITE_IM_IND


The application needs to implement in PNS_IF_READ_IM_IND the PNS_IF_IM_TYPE_IM0FILTER. With IM0FILTER

the application can return which module and submodule has own I&M data.


To get this IM0FILTER request, it is necessary to send this from IO Controller. An easy way is to use the Testcase  IP_UDP_RPC_I&M_EPM testcase from ART Test Tool.

The application can respond with some flags to this request.


For example, the requests for Slot 0 and Subslot 1 (DAP):

The application sends back the response with these flags:

      ptReadImRes → tData.tData.atIM0FilterData[0].ulFlags = PNS_IF_IM0_FILTER_DATA_HAS_IM_DATA | PNS_IF_IM0_FILTER_DATA_MODULE_REF | PNS_IF_IM0_FILTER_DATA_DEVICE_REF;


PNS_IF_IM0_FILTER_DATA_HAS_IM_DATA means, that the module has his own I&M Data:

(The DAP has in data)


PNS_IF_IM0_FILTER_DATA_MODULE_REF means, that the I&M data of this module are the reference for all submodules which belong to this module:

(All other submodules respond with the I&M data from the DAP)


PNS_IF_IM0_FILTER_DATA_DEVICE_REF is only used once (on the DAP) and means that all other modules and submodules without own I&M data will refer to this module:

(All other modules and submodules respond with the I&M data from the DAP)


That means GSDML with

DAP: <VirtualSubmoduleItem ID="DIM 31" IM5_Supported="false" MayIssueProcessAlarm="false" SubmoduleIdentNumber="0x00003010" Writeable_IM_Records="1 2 3">


For Slot 0 Subslot 1

      ptReadImRes->tData.tData.atIM0FilterData[0].ulFlags = PNS_IF_IM0_FILTER_DATA_HAS_IM_DATA | PNS_IF_IM0_FILTER_DATA_MODULE_REF | PNS_IF_IM0_FILTER_DATA_DEVICE_REF;


module: <VirtualSubmoduleItem ID="10byteinput" MayIssueProcessAlarm="false" SubmoduleIdentNumber="0x00000001" Writeable_IM_Records="1 2">


For Slot 2 Subslot 1

      ptReadImRes->tData.tData.atIM0FilterData[0].ulFlags = PNS_IF_IM0_FILTER_DATA_HAS_IM_DATA | PNS_IF_IM0_FILTER_DATA_MODULE_REF;

(Slot 2 has its own I&M data and will not respond with the I&M data from the DAP)



(For the module which is not marked yellow, only

      ptReadImRes->tData.tData.atIM0FilterData[0].ulFlags = PNS_IF_IM0_FILTER_DATA_HAS_IM_DATA; 

is necessary because there are no submodules).


More information to I&M can be found here: How to deal with I&M data?


6. Indication implementation

I&M0 is always read only. If a PNS_IF_WRITE_IM_IND comes for I&M0, this cannot be correct. I&M0 has the value usIMRevisionCounter. This must be updated as soon as I&M1- I&M4 are written.

I&M1 - I&M4 are read/write and need to be saved remanent on the application flash.

I&M5 is always read only.

That means each write and read can come for a slot with a Subslot and the application needs to check if the combination of requested slot and Subslot and write or read is possible.


6. TIA Portal read I&M0