blob: c14363cd6a19e9fb75341ee44dafad6eccc1c76f [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>PLC4X &#x2013; </title>
<script src="../../js/jquery.slim.min.js" type="text/javascript"></script>
<!--script src="../../js/popper.min.js" type="javascript"></script-->
<script src="../../js/bootstrap.bundle.min.js" type="text/javascript"></script>
<!-- The tooling for adding images and links to Apache events -->
<script src="https://www.apachecon.com/event-images/snippet.js" type="text/javascript"></script>
<!-- FontAwesome -->
<link rel="stylesheet" href="../../css/all.min.css" type="text/css"/>
<!-- Bootstrap -->
<link rel="stylesheet" href="../../css/bootstrap.min.css" type="text/css"/>
<!-- Some Maven Site defaults -->
<link rel="stylesheet" href="../../css/maven-base.css" type="text/css"/>
<link rel="stylesheet" href="../../css/maven-theme.css" type="text/css"/>
<!-- The PLC4X version of a bootstrap theme -->
<link rel="stylesheet" href="../../css/themes/plc4x.css" type="text/css" id="pagestyle"/>
<!-- A custom style for printing content -->
<link rel="stylesheet" href="../../css/print.css" type="text/css" media="print"/>
<meta http-equiv="Content-Language" content="en"/>
</head>
<body class="composite">
<nav class="navbar navbar-light navbar-expand-md bg-faded justify-content-center border-bottom">
<!--a href="/" class="navbar-brand d-flex w-50 mr-auto">Navbar 3</a-->
<a href="https://plc4x.apache.org/" id="bannerLeft"><img src="../../images/apache_plc4x_logo_small.png" alt="Apache PLC4X"/></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsingNavbar3">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse w-100" id="collapsingNavbar3">
<ul class="navbar-nav w-100 justify-content-center">
<li class="nav-item">
<a class="nav-link" href="../../index.html">Home</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="../../users/index.html">Users</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../developers/index.html">Developers</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../apache/index.html">Apache</a>
</li>
</ul>
<ul class="nav navbar-nav ml-auto justify-content-end">
<li class="nav-item row valign-middle">
<a class="acevent" data-format="wide" data-mode="light" data-event="random" style="width:240px;height:60px;"></a>
</li>
</ul>
</div>
</nav>
<div class="container-fluid">
<div class="row h-100">
<nav class="col-sm-push col-md-2 pt-3 sidebar">
<div class="sidebar-sticky">
<ul class="nav flex-column">
<li class="nav-item">
<a href="../../users/index.html" class="nav-link">Section Home</a>
</li>
<li class="nav-item">
<a href="../../users/download.html" class="nav-link">Download</a>
</li>
<li class="nav-item">
<a href="../../users/adopters.html" class="nav-link">Adopters</a>
</li>
<li class="nav-item">
<a href="../../users/commercial-support.html" class="nav-link">Commercial support</a>
</li>
<li class="nav-item">
<a href="../../users/gettingstarted.html" class="nav-link">Getting Started</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../users/getting-started/plc4go.html" class="nav-link">Go</a>
</li>
<li class="nav-item">
<a href="../../users/getting-started/plc4j.html" class="nav-link">Java</a>
</li>
<li class="nav-item">
<a href="../../users/getting-started/using-snapshots.html" class="nav-link">Using SNAPSHOTS</a>
</li>
<li class="nav-item">
<a href="../../users/getting-started/general-concepts.html" class="nav-link">General Concepts</a>
</li>
<li class="nav-item">
<a href="../../users/getting-started/virtual-modbus.html" class="nav-link">Virtual Modbus</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../users/blogs-videos-and-slides.html" class="nav-link">Blogs, Videos and Slides</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/index.html" class="nav-link">Protocols</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../users/protocols/ab-eth.html" class="nav-link">AB-ETH</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/ads.html" class="nav-link">ADS/AMS</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/bacnetip.html" class="nav-link">BACnet/IP</a>
</li>
<li class="nav-item">
<strong class="nav-link">CANopen</strong>
</li>
<li class="nav-item">
<a href="../../users/protocols/deltav.html" class="nav-link">DeltaV</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/df1.html" class="nav-link">DF1</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/ethernet-ip.html" class="nav-link">EtherNet/IP</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/firmata.html" class="nav-link">Firmata</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/knxnetip.html" class="nav-link">KNXnet/IP</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/modbus.html" class="nav-link">Modbus</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/opc-ua.html" class="nav-link">OPC UA</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/plc4x.html" class="nav-link">PLC4X (Proxy)</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/s7.html" class="nav-link">S7 (Step7)</a>
</li>
<li class="nav-item">
<a href="../../users/protocols/simulated.html" class="nav-link">Simulated</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../users/transports/index.html" class="nav-link">Transports</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../users/transports/tcp.html" class="nav-link">TCP</a>
</li>
<li class="nav-item">
<a href="../../users/transports/udp.html" class="nav-link">UDP</a>
</li>
<li class="nav-item">
<a href="../../users/transports/serial.html" class="nav-link">Serial</a>
</li>
<li class="nav-item">
<a href="../../users/transports/socketcan.html" class="nav-link">SocketCAN</a>
</li>
<li class="nav-item">
<a href="../../users/transports/raw-socket.html" class="nav-link">Raw Socket</a>
</li>
<li class="nav-item">
<a href="../../users/transports/pcap-replay.html" class="nav-link">PCAP Replay</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../users/integrations/index.html" class="nav-link">Integrations</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../users/integrations/apache-calcite.html" class="nav-link">Apache Calcite</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-camel.html" class="nav-link">Apache Camel</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-edgent.html" class="nav-link">Apache Edgent</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-iotdb.html" class="nav-link">Apache IoTDB</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-kafka.html" class="nav-link">Apache Kafka</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-nifi.html" class="nav-link">Apache NiFi</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/apache-streampipes.html" class="nav-link">Apache StreamPipes</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/eclipse-ditto.html" class="nav-link">Eclipse Ditto</a>
</li>
<li class="nav-item">
<a href="../../users/integrations/eclipse-milo.html" class="nav-link">Eclipse Milo OPC UA Server</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../users/tools/index.html" class="nav-link">Tools</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../users/tools/capture-replay.html" class="nav-link">Capture Replay</a>
</li>
<li class="nav-item">
<a href="../../users/tools/connection-pool.html" class="nav-link">Connection Pool</a>
</li>
<li class="nav-item">
<a href="../../users/tools/connection-cache.html" class="nav-link">Connection Cache</a>
</li>
<li class="nav-item">
<a href="../../users/tools/opm.html" class="nav-link">Object PLC Mapping (OPM)</a>
</li>
<li class="nav-item">
<a href="../../users/tools/scraper.html" class="nav-link">Scraper</a>
</li>
<li class="nav-item">
<a href="../../users/tools/testing.html" class="nav-link">PLC4X without a PLC and Unit Testing</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../users/industry40.html" class="nav-link">Industry 4.0 with Apache</a>
</li>
<li class="nav-item">
<a href="../../users/security.html" class="nav-link">Security</a>
</li>
</ul>
</div>
</nav>
<main role="main" class="ml-sm-auto px-4 col-sm-pull col-md-9 col-lg-10 h-100">
<div class="sect1">
<h2 id="canopen">CANopen</h2>
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<img src="../../images/users/protocols/can_banner.png" alt="banner" width="512" height="167"/>
</div>
</div>
<div class="sect2">
<h3 id="can_in_automation">CAN in Automation</h3>
<div class="paragraph">
<p>CANopen is a specific protocol built on top of CAN bus.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 22.2222%;"/>
<col style="width: 22.2222%;"/>
<col style="width: 55.5556%;"/>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Code</p></td>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="paragraph">
<p><code>canopen</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name</p></td>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="paragraph">
<p>CANopen (based on CAN 2.0A) - client side</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Maven Dependency</p></td>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="listingblock">
<div class="content">
<pre>&lt;dependency&gt;
&lt;groupId&gt;org.apache.plc4x&lt;/groupId&gt;
&lt;artifactId&gt;plc4j-driver-canopen&lt;/artifactId&gt;
&lt;version&gt;{current-last-released-version}&lt;/version&gt;
&lt;/dependency&gt;</pre>
</div>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Default Transport:</p></td>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="paragraph">
<p><code>socketcan</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Compatible Transports:</p></td>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="ulist">
<ul>
<li>
<p><code>socketcan</code></p>
</li>
</ul>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="3"><p class="tableblock">Supported Operations</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CANopen PDO</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>read</code> / <code>write</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>PDO messages are broadcasted to the bus and have to be mapped at application layer.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CANopen SDO</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>read</code> / <code>write</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>SDO are request/response conversations. Both read and write path is supported.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>subscribe</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>Receiving PDO messages requires construction of valid subscription.</p>
</li>
<li>
<p>It is possible to subscribe to CANopen NMT messages.</p>
</li>
</ul>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="3"><p class="tableblock">Options</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>heartbeat</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Forces PLC4X to send CANopen heartbeat (NMT) messages to the bus.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>nodeId</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>CAN node identifier. Depending on used CAN version it might be 11 or 29 bit unsigned int.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>request-timeout</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Time after which dispatched BUS operation (ie. SDO request) will be marked as failed.</p>
</div></div></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="more_details_on_the_driver">More details on the driver</h3>
<div class="paragraph">
<p>CAN, despite (or due) to its popularity has ambiguous meaning.
There are multiple articles and sources which attempts to give introduction, yet very few of them is consistent between each other.</p>
</div>
<div class="paragraph">
<p>There are two dominant formats of frames - CAN 2.0A and 2.0B:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>CAN 2.0A uses 11 bit identifier and up to 8 bytes of data.</p>
</li>
<li>
<p>CAN 2.0B uses 29 bit identifier and up to 8 bytes of data.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>To make things worse with introduction of CAN FD amount of combinations increased even more.
Double check frame format as this integration supports CANopen and does not support CANopen FD nor CAN 2.0B.</p>
</div>
<div class="paragraph">
<p>Further reading on CAN flavors:
<a href="https://en.wikipedia.org/wiki/CAN_bus">https://en.wikipedia.org/wiki/CAN_bus</a></p>
</div>
<div class="paragraph">
<p>Default transport used with this protocol is socketcan.
Currently, only 2.0A format (up to 8 bytes of data) is supported.</p>
</div>
<div class="paragraph">
<p>Implemented driver supports currently socketcan transport.
Change of transport requires code modifications and injection of new "transport" type which will encode CANopen payloads to specific frame format.</p>
</div>
<div class="paragraph">
<p>Socketcan seems to be most widespread way to access CAN bus.
It also masks different hardware variants which might come with their own drivers.</p>
</div>
<div class="paragraph">
<p>The CANopen specification defines Object Dictionary (OD).
This driver does honor OD structure through usage of index and sub index for addressing fields.
It does not ship Electronic Data Sheet (EDS) parser leaving it for applications who wish to utilize it.</p>
</div>
</div>
<div class="sect2">
<h3 id="address_format">Address Format</h3>
<div class="paragraph">
<p>CANopen specification defines several groups of addresses dedicated to certain kind of operations.
Critical services and message exchanges related with them have lower identifiers making them wining eventual bus access.</p>
</div>
<div class="paragraph">
<p>The array size block is necessary only if application expect same value several times.
If SDO returns for example 4 values of UNSIGNED8 it can be declared as <code>&lt;service&gt;:&lt;nodeId&gt;:UNSIGNED8[4]</code> for PDO.
Equivalent for SDO is <code>&lt;service&gt;:&lt;nodeId&gt;:&lt;index&gt;/&lt;subindex&gt;:UNSIGNED8[4]</code>.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;"/>
<col style="width: 20%;"/>
<col style="width: 20%;"/>
<col style="width: 40%;"/>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Service</th>
<th class="tableblock halign-left valign-top">Format</th>
<th class="tableblock halign-left valign-top">Supported operations</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">SDO</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>SDO:nodeId:index/subindex:type[arraySize]</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p><code>read</code></p>
</li>
<li>
<p><code>write</code></p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>SDO is for request/response communication.
Both expedited and segmented modes are supported.
No support for block transfer.</p>
</div>
<div class="paragraph">
<p>Transfer kind is automatically determined based on payload length.
All numeric values - ndodeId, index, subindex can be specified using hexadecimal notation (ie. <code>0xA</code>).</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">PDO</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>TRANSMIT_PDO_1:nodeId:type[arraySize]</p>
</li>
<li>
<p>RECEIVE_PDO_1:nodeId:type[arraySize]</p>
</li>
<li>
<p>TRANSMIT_PDO_2:nodeId:type[arraySize]</p>
</li>
<li>
<p>RECEIVE_PDO_2:nodeId:type[arraySize]</p>
</li>
<li>
<p>TRANSMIT_PDO_3:nodeId:type[arraySize]</p>
</li>
<li>
<p>RECEIVE_PDO_3:nodeId:type[arraySize]</p>
</li>
<li>
<p>TRANSMIT_PDO_4:nodeId:type[arraySize]</p>
</li>
<li>
<p>RECEIVE_PDO_4:nodeId:type[arraySize]</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p><code>subscribe</code></p>
</li>
<li>
<p><code>write</code></p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>PDO is an asynchronous operation hence receiving of it requires subscription.
Check Apache PLC4X API documentation for more detailed example of how to use subscriptions API.
Subscriber will be notified with value mapped to type defined in field syntax.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">NMT</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>NMT</p>
</li>
<li>
<p>NMT:nodeId</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p><code>subscribe</code></p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>NMT messages are sent using CAN node ID <code>0</code>.
They have the highest priority on the bus.
Messages of this kind indicate operating state of an node (booted, operational).</p>
</div>
<div class="paragraph">
<p>Subscriptions to this service receive structure with two fields: <code>node</code> (USINT) and <code>state</code> (USINT).
If subscription sets <code>nodeId</code> to 0 it will receive state updates for all bus participants.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">HEARTBEAT</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>HEARTBEAT</p>
</li>
<li>
<p>HEARTBEAT:nodeId</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p><code>subscribe</code></p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>HEARTBEAT messages have the lowest priority on the bus.
They have the highest priority on the bus.
Messages of this kind indicate operating state of an node (booted, operational).</p>
</div>
<div class="paragraph">
<p>Subscriptions to this service receive structure with two fields: <code>node</code> (USINT) and <code>state</code> (USINT).
If subscription sets <code>nodeId</code> to 0 it will receive state updates for all bus participants.</p>
</div></div></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Below table contains type mapping defined in CANopen specification.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;"/>
<col style="width: 33.3333%;"/>
<col style="width: 33.3334%;"/>
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CANopen Type</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Length (in bits)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PLC4X Type</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">BOOLEAN</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">BOOL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED8</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">USINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED16</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">UINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED24</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">UDINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">UDINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED40</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">40</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ULINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED48</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">48</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ULINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED56</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">56</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ULINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNSIGNED64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ULINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER8</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">SINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER16</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">16</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">INT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER24</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">24</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">DINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">DINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER40</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">40</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER48</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">48</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER56</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">56</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INTEGER64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LINT</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">REAL32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">REAL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">REAL64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LREAL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RECORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 * size</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">BYTE</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">OCTET_STRING</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 * size</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">STRING (UTF-8)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">VISIBLE_STRING</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 * size</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">STRING (UTF-8)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">TIME_OF_DAY</p></td>
<td class="tableblock halign-center valign-top" colspan="2"><p class="tableblock">unsupported</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">TIME_DIFFERENCE</p></td>
<td class="tableblock halign-center valign-top" colspan="2"><p class="tableblock">unsupported</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UNICODE_STRING</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 * size</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">STRING (UTF-8)</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>All string types are decoded using UTF-8 encoding regardless of their kind (octet, visible, unicode).
In case if device returns text using different encoding it is recommended to use <code>RECORD</code> type and construct text manually above PLC4X.</p>
</div>
<div class="paragraph">
<p>The size in case of variable length structures is automatically assumed to full length of SDO answer.
In case of writing length of field can be ommited.
For example request <code>write(SDO:1:2/3:RECORD, payload)</code> will try to write whole payload to specified address.
Same applies to responses sent by devies as requester often might not know full length of reply payload.</p>
</div>
</div>
</div>
</div>
</main>
<footer class="pt-4 my-md-5 pt-md-5 w-100 border-top">
<div class="row justify-content-md-center" style="font-size: 13px">
<div class="col col-6 text-center">
Copyright &#169; 2017&#x2013;2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.<br/>
Apache PLC4X, PLC4X, Apache, the Apache feather logo, and the Apache PLC4X project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
<br/><div style="text-align:center;">Home screen image taken from <a
href="https://flic.kr/p/chEftd">Flickr</a>, "Tesla Robot Dance" by Steve Jurvetson, licensed
under <a href="https://creativecommons.org/licenses/by/2.0/">CC BY 2.0 Generic</a>, image cropped
and blur effect added.</div>
</div>
</div>
</footer>
</div>
</div>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="../../js/jquery.slim.min.js"></script>
<script src="../../js/popper.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script type="text/javascript">
$('.carousel .carousel-item').each(function(){
var next = $(this).next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
for (let i = 0; i < 3; i++) {
next=next.next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
}
});
</script>
</body>
</html>