In the context of the Web of Things (WoT), a Binding is a blueprint that gives guidance on how to implement a specific IoT protocol, data format or IoT platform. The WoT Thing Description specification explains the overall mechanism and the WoT Binding Registry provides the formal requirements for any binding to follow. This document gives is a binding document for the PROFINET protocol, which is a well-known high-speed industrial ethernet protocol for communication between industrial control and automation devices.
More specifically, this document defines a set of vocabulary terms that can be used inside a Thing Description [[WOT-THING-DESCRIPTION]] (TD) document, and associated rules which allow to describe WoT operations using the PROFINET protocol over the network. Additionally, relevant examples are provided to showcase different vocabulary terms and the associated behavior.
This document is a work in progress
PROFINET is an open standard communication protocol developed and published by PROFIBUS Nutzerorganisation (PNO) for Industrial Ethernet. PROFINET which is an Ethernet version of PROFIBUS is designed to satisfy requirements of most industrial automation processes by providing a high-speed data transfer for time critical applications like motion control and drive. It can also have a safety (PROFIsafe) implementation onboard for safety related application.
Generally, profinet is classified into PROFINET IO (Input Output) which is used for distributed input/output processes of field devices (sensors and actuators) data and PROFINET CBA (Component Based Automation) which is used for distributed automation. The scope of this document focuses on the PROFINET IO. PROFINET IO network consist of three main actors which are IO controller, IO supervisor and IO device. The IO controllers are PLCs and DCS, they are most used for profinet cyclic communications like IO data exchange. The IO supervisor is a standalone application that is mostly used for acyclic communications like diagnostics and parameterization. The IO device is general field devices that are controlled by both IO controller and IO supervisor [[IEC CD 61158-5-10]].
Due to the different requirements by different industrial automation applications, PROFINET IO provides three different communications channels to exchange data between IO controllers and IO device or IO supervisor and IO devices. The Real-Time (RT) and Isochronous Real Time (IRT) channels are used for cyclic data transfer and high-speed cyclic data transfer for motion control application respectively, the Non-Real-Time channel which is based on User Data Protocol (UDP) is mostly used by IO supervisor for parameterization, diagnostic and acyclic communications. The RT channel can also be used for acyclic real time messages like alarm The addressing in PROFINET slot/sublsot/index mechanism where the slot identifies a module and subslot identifies submodules that exist within a module. The index identifies datapoint of interest in the submodule [[IEC CD 61158-5-10]].
Concretely, this document describes how WoT TDs can be used to describe devices that use the PROFINET acyclic non-real time communication (IO supervisor) [[Profinet Uni]]. The IO controller operations that use cyclic communication is beyond the scope of this document. This document explains how to create valid URLs and Forms for read or write operation from or to an IO device respectively. Developers are encouraged to use this document as an implementation guideline and as a reference for the creation of their own binding implementations. The following sections will cover the URL format, the vocabulary and a list of Form examples.
A Thing Description instance with PROFINET Binding complies with this specification if it follows the normative statements in and .
A JSON Schema [[?JSON-SCHEMA]] to validate Thing Description instances containing PROFINET Binding is provided in the GitHub repository.
In conformance with the structure of other bindings provided in the WoT TD, the URL form defines a resource
endpoint's information, and it follows a standard URL scheme common to the web. For PROFINET, the URL scheme
will begin with
profinet://
and that will be the only valid scheme to consider.
The following shows the typical structure of an URL of the PROFINET protocol:
profinet://{address}/{slot}/{subslot}/?api={api}&index={index}&datalength={datalength}
Where:
{address}
is the IP address of the PROFINET IO device{slot}
is the module where the PROFINET IO module is plugged into. See
vocabulary
{subslot}
is the is the logical submodule where the PROFINET IO device parameter is located. See
vocabulary
{api}
known as Application Process Identifier, for distinguishing profiles parameter. See
vocabulary
{index}
identifies a parameter within slot/subslot address. See
vocabulary
{datalength}
defines the length of byte resource payload is expected to be. See
vocabulary
For the full syntax, see [[[#abnf]]]
This section describes the vocabulary used in the PROFINET protocol. An implementation of this binding should use the vocabulary defined in this section to describe the different configurations that Things can use to exchange data on the Web of Things.
Vocabulary term | Description | Assignment | Type |
---|---|---|---|
profv:slot |
Specifies the location where the IO device is plugged in to. | required | integer |
profv:subslot |
Provides the interface for the parameter to read/write. A slot can contain one or more subslots | required | integer |
profv:index |
An identifier that uniquely points to a resource within slot/subslot combination of a PROFINET IO device | required | integer |
profv:api |
Used to provide additional addressing to differentiate profile parameters. If the term is not provided,
the TD processor treats it as the default of zero .
|
optional | integer |
profv:datalength |
used in application and network optimization to appropriately define the specific data length of resource payload. | optional | integer |
Vocabulary term | Description | Assignment | Type |
---|---|---|---|
profv:mostSignificantByte |
When true , it indicates that the byte order of the data in the PROFINET message is
most-significant byte (i.e., Big-Endian). When false , it indicates least-significant-byte
(i.e., Little-Endian).If the term is not provided, the TD processor defaults it to true
|
optional | boolean |
profv:mostSignificantWord |
When true , it indicates that the word order of the data in the PROFINET message is
most-significant-word (i.e., no word swapping). When false , it indicates
least-significant-word (i.e., word swapping). If the term is not provided, the TD processor treats it as
the default of true .
|
optional | boolean |
profv:method |
Indicates operation to perform on defined affordance. |
string
(one of "READ", "WRITE") |
|
profv:pollingTime |
IO supervisor polling rate in milliseconds. To ensure that the cyclic communication will not be interrupted, it is recommended to keep this polling rate above the IO device's send clock time. | optional | integer |
profv:timeout |
PROFINET response maximum waiting time. Defines how long the runtime should wait to receive a reply from the device. | optional | integer |
profv:byteOffset |
For object type properties. Used to identify the starting point within a byte stream
payload that represents a property.
|
optional | integer |
profv:byteLength |
For object type properties. Used to identify the byte length of a property from the byte
stream payload
|
optional | integer |
profv:bitOffset |
For object type properties. Used to identify the starting point within a bit stream payload
that represents a property.
|
optional | integer |
profv:bitlength |
For object type properties. Used to identify the bit length of a property from the bit
stream payload
|
optional | integer |
profv:payloadMapping |
used for object to provides logical mapping information of a complex payload from a
PROFINET device
|
optional | Map of PayloadMapping |
profv:type |
Specifies the data type contained in the request or response payload. | optional | PayloadDataType |
The profv:mostSignificantByte
and profv:mostSignificantWord
properties within a
PROFINET binding instance define the byte and word order of data within a PROFINET payload. In PROFINET
communications, the arrangement of bytes and words can vary between systems, and these properties provide a
declarative way to capture such configurations. For instance, in Big-Endian byte order (e.g.,
AABBCC
), the most significant byte comes first, and setting
profv:mostSignificantByte
to true
ensures the correct interpretation of the data as
AABBCC
. Conversely, in Little-Endian byte order (e.g., CCBBAA
), the least
significant byte comes first; therefore. profv:mostSignificantByte
has to be set to
false
. Similarly, the profv:mostSignificantWord
property extends this functionality
to message payloads composed by more than two bytes. For example, given a message payload composed by four
bytess (e.g., AABBCCDD
), with profv:mostSignificantWord
set to true
,
the client will interpret the data as AABBCCDD
, while setting the property to
false
will result in the client interpreting the data as CCDDAABB
. Although almost
all implementations provided by vendors are Big-Endian, the PROFINET specification does not specify
Big-Endianness. This means that some off-the-shelf or user-specific implementations might adopt
Little-Endianness. Therefore, when creating a Thing Description (TD), users are advised to account for such
potential deviations by setting the profv:mostSignificantWord
and
profv:mostSignificantByte
properties accordingly.
The PayloadDataType
class within a PROFINET binding instance defines values for the
profv:type
property, which is used to specify the expected data types of payload content in
PROFINET messages. It offers a set of terms taken from the PROFINET specification (chapter 5 of IEC
61158-5-10)[ref] to cover the most common data types used in PROFINET messages. Note that the
PayloadDataType
entity is designed to describe established conventions in the PROFINET ecosystem;
further development might remove this functionality or add new terms. Currently, the
PayloadDataType
class includes the following data types[[IEC CD 61158-6-10]]:
Value | Byte Length | Code | JSON Type |
---|---|---|---|
Boolean | 1 | 1 | Boolean |
Integer8 | 1 | 2 | Integer or Number |
Integer16 | 2 | 3 | Integer or Number |
Integer32 | 4 | 4 | Integer or Number |
Unsigned8 | 1 | 5 | Integer or Number |
Unsigned16 | 2 | 6 | Integer or Number |
Unsigned32 | 4 | 7 | Integer or Number |
Unsigned64 | 8 | 56 | Integer or Number |
Float32 | 4 | 8 | Number |
Float64 | 8 | 15 | Number |
VisibleString | profv:datalength | 9 | String |
OctetString | profv:datalength | 10 | String |
UnicodeString8 | profv:datalegth | 40 | String |
61131_STRING | profv:datalegth | 41 | String |
61131_WSTRING | profv:datalegth | 42 | String |
TimeStamp | 12 | 60 | String |
TimeStampDifference | 12 | 61 | String |
TimeStampDifferenceShort | 8 | 62 | Integer |
Unsigned8+Unsigned8 | 2 | 102 | Integer or Number |
Float32+Unsigned8 | 5 | 101 | Integer or Number |
OctetString2+Unsigned8 | 3 | 103 | String |
Unsigned8_S | 1 | 106 | Integer or Number |
Unsigned16_S | 2 | 104 | Integer or Number |
Integer16_S | 2 | 105 | Integer or Number |
OctetString_S | profv:datalegth | 107 | String |
N2 | 2 | 113 | Integer or Number |
N4 | 4 | 114 | Integer or Number |
V2 | 2 | 115 | Object |
L2 | 2 | 116 | Object |
R2 | 2 | 117 | Integer or Number |
T2 | 2 | 118 | Integer or Number |
T4 | 4 | 119 | Integer or Number |
D2 | 2 | 120 | Integer or Number |
E2 | 2 | 121 | Integer or Number |
C4 | 4 | 122 | Integer or Number |
X2 | 2 | 123 | Integer or Number |
X4 | 4 | 124 | Integer or Number |
Unipolat2.16 | 2 | 125 | Integer or Number |
Float64 | 8 | 15 | Integer or Number |
The payloadMapping
class within a PROFINET binding instance helps map the nested properties of
object types. It is common that the payload of a PROFINET device response is provided in a complex/object
form. This payload requires mapping the individual parameters to object definitions provided by the Thing
Description dataSchema
class. The table below shows the terms provided by the
payloadMapping
class.
Vocabulary term | Description | Assignment | Type |
---|---|---|---|
profv:byteOffset |
For object type properties. Used to identify the starting point within a byte stream
payload that represents a property.
|
optional | integer |
profv:byteLength |
For object type properties. Used to identify the byte length of a property from the byte
stream payload
|
optional | integer |
profv:bitOffset |
For object type properties. Used to identify the starting point within a bit stream payload
that represents a property.
|
optional | integer |
profv:bitlength |
For object type properties. Used to identify the bit length of a property from the bit
stream payload
|
optional | integer |
profv:enumeratedValue |
used for object type properties to identify the bit mask of a proterty from the byte stream
or byte payload
|
optional | Arrayof EnumeratedValue |
profv:type |
Specifies the data type contained in the request or response payload. | optional | PayloadDataType |
The enumeratedValue class within the PROFINET binding helps provide context to encoded parameters in the payload. Bit payloads in PROFINET are sometimes used as encoded payload to logical mean something aside from 1 and 0. Information about how the encoding payload will be decoded is defined in this section. The table below defines the terms used in the enumeratedValue class.
Vocabulary term | Description | Assignment | Type |
---|---|---|---|
profv:encodedPayload |
used for object type properties to identify the bit mask of a proterty from the byte stream
or byte payload
|
optional | number or boolean |
profv:decodedPayload |
used for object type properties to identify the bit mask of a proterty from the byte stream
or byte payload
|
optional | string , number or boolean |
This section describes strategies and default values to employ protocol specific concepts within the WoT Interaction model.
The following table lists the default mappings between the protocol specific concepts and the WoT concepts.
Please note that operations that are not listed in the table are not supported by this binding. For example,
since the scope of this binding focuses on acyclic communication of the PROFINET protocol, the
subscribeevent
operation is not supported.
Operation | Default Binding |
---|---|
readproperty |
"profv:method": "READ" |
writeproperty |
"profv:method": "WRITE" |
readallproperties |
"profv:method": "READ" |
writeallproperties |
"profv:method": "WRITE" |
readmultipleproperties |
"profv:method": "READ" |
writemultipleproperties |
"profv:method": "WRITE" |
Operation | Default | Comments |
---|---|---|
profv:api |
0
|
|
profv:mostSignificantByte |
true
|
|
profv:mostSignificantWord |
true
|
|
profv:timeout |
infinite
|
{ "@context": [ "https://www.w3.org/2019/wot/td/v1", { "profv": "https://profinet_vocabulary_context" } ], "@type": "tm:ThingModel", "title": "ET200SP", "id": "{{ID}}", "profv:deviceId": 12, "profv:vendorId": 268, "base": "profinet://192.168.0.100", "securityDefinitions": { "nosec_sc": { "scheme": "nosec" } }, "security": "nosec_sc", "properties": {}, "actions": {}, "events": {} }[[[#example-device-property]]] shows the minimal set of terms to read or write to a PROFINET device. Notice that the slot, subslot is contained in the href as the first and second elements of the URL path respectively. Also, as part of the PROFINET vocabulary is a polling mechanism (
profv:pollingTime
) can be used to set
intervals for reading a PROFINET device parameter.
{ "@context": [ "https://www.w3.org/2019/wot/td/v1", { "profv": "https://profinet_vocabulary_context" } ], "@type": "tm:ThingModel", "title": "ET200SP", "id": "{{ID}}", "profv:deviceId": 12, "profv:vendorId": 268, "securityDefinitions": { "nosec_sc": { "scheme": "nosec" } }, "security": "nosec_sc", "properties": { "Buffer time": { "title": "Buffer time", "type": "integer", "minimum": 1, "maximum": 60000, "default": 3000, "unit": "s", "forms": [ { "op": [ "writeproperty", "readproperty" ], "href": "profinet://127.0.0.1/0/1?api=0&index=268&datalength=2", "contentType": "application/octet-stream", "profv:type": "Unsigned16", "profv:pollingTime": 200 } ] } } }[[[#example-complex-datatype]]] shows how object type property is defined in TM form and its mappings. It also show how bit payload encodings and decodings are defined as enumeration.
{ "@context": [ "https://www.w3.org/2019/wot/td/v1", { "profv": "https://profinet_vocabulary_context" } ], "@type": "tm:ThingModel", "title": "ET200SP", "id": "{{ID}}", "profv:deviceId": 12, "profv:vendorId": 268, "securityDefinitions": { "nosec_sc": { "scheme": "nosec" } }, "security": "nosec_sc", "properties": { "Buffering parameters": { "title": "Buffering parameters", "type": "object", "properties": { "Buffer time": { "type": "integer", "unit": "s", "minimum": 1, "maximum": 32767, "default": 600 }, "Buffer time 2": { "type": "integer", "unit": "s", "minimum": 1, "maximum": 300, "default": 60 }, "Buffer threshold voltage": { "type": "integer", "unit": "V", "minimum": 2100, "maximum": 2500, "default": 2150 }, "Stop buffering threshold voltage": { "type": "integer", "minimum": 1800, "maximum": 2300, "default": 1850 }, "Input voltage OK time": { "type": "integer", "unit": "ms", "minimum": 5, "maximum": 65000, "default": 1000 }, "Downtime alarm": { "type": "integer", "unit": "ms", "minimum": 0, "maximum": 20000, "default": 100 }, "Buffering allowed": { "type": "boolean" }, "Enable reset after buffering": { "type": "boolean" } }, "forms": [ { "op": [ "writeproperty", "readproperty" ], "href": "profinet://127.0.0.1/0/1?api=0&index=1&datalength=14", "contentType": "application/octet-stream", "profv:type": "object", "profv:pollingTime": 200, "profv:payloadMapping": { "Buffer time 2": { "profv:type": "Unsigned16", "profv:byteOffset": 2, "profv:byteLength": 2 }, "Buffer threshold voltage": { "profv:type": "Unsigned16", "profv:byteOffset": 4, "profv:byteLength": 2 }, "Stop buffering threshold voltage": { "profv:type": "Unsigned16", "profv:byteOffset": 6, "profv:byteLength": 2 }, "Input voltage OK time": { "profv:type": "Unsigned16", "profv:byteOffset": 8, "profv:byteLength": 2 }, "Downtime alarm": { "profv:type": "Unsigned16", "profv:byteOffset": 10, "profv:byteLength": 2 }, "Buffering allowed": { "profv:type": "boolean", "profv:byteOffset": 12, "profv:byteLength": 1, "profv:bitOffset": 0, "profv:enumeratedValue": [ { "profv:encondedPayload": 0, "profv:decodedPayload": false }, { "profv:encondedPayload": 1, "profv:decodedPayload": true } ] }, "Enable reset after buffering": { "profv:type": "boolean", "profv:byteOffset": 13, "profv:byteLength": 1, "profv:bitOffset": 0, "profv:enumeratedValue": [ { "profv:encondedPayload": 0, "profv:decodedPayload": false }, { "profv:encondedPayload": 1, "profv:decodedPayload": true } ] } } } ] } } }
The following describe the [[[#url]]] using [[[RFC2234]]] with the reference to [[[uri]]] specification.
PROFINET-URI = "profinet://" authority path-profinet [ "?api=" api, "?index=" index, "?datalength=" datalength ] path-profinet = "/" slot "/" subslot slot=1*DIGIT subslot=1*DIGIT api=1*DIGIT index=1*DIGIT datalength=4*DIGIT