blob: 0c1fac00c27536c790dd078f03ea54d562f5dd48 [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">
<a href="../../users/protocols/canopen.html" class="nav-link">CANopen</a>
</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">
<strong class="nav-link">S7 (Step7)</strong>
</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="s7_step7">S7 (Step7)</h2>
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<img src="../../images/users/protocols/s7_banner.png" alt="banner" width="512" height="167"/>
</div>
</div>
<div class="sect2">
<h3 id="connection_string_options">Connection String Options</h3>
<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>s7</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>Siemens S7 Protocol</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-s7&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>tcp</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>tcp</code> (Default Port: 102)</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"></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>read</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Only supported with <code>tcp</code> transport.</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>write</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Only supported with <code>tcp</code> transport.</p>
</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>local-rack</code> (1)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Rack</code> value for the client (PLC4X device). Defaults to 1.</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>local-slot</code> (1)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Slot</code> value for the client (PLC4X device). Defaults to 1.</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>remote-rack</code> (0)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Rack</code> value for the remote (PLC). Defaults to 0.</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>remote-slot</code> (0)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Slot</code> value for the remote (PLC). Defaults to 0.</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>pdu-size</code> (1024)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Maximum size of a data-packet sent to and received from the remote PLC.
During the connection process both parties will negotiate a maximum size both parties can work with and is equal or smaller than the given value is used.
The driver will automatically split up large requests to not exceed this value in a request or expected response.</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>max-amq-caller</code> (8)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Maximum number of unconfirmed requests the PLC will accept in parallel before discarding with errors.
This parameter also will be negotiated during the connection process and the maximum both parties can work with and is equal or smaller than the given value is used.
The driver will automatically take care not exceeding this value while processing requests. Too many requests can cause a growing queue.</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>max-amq-callee</code> (8)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Maximum number of unconfirmed responses or requests PLC4X will accept in parallel before discarding with errors.
This option is available for completeness and is correctly handled out during the connection process, however it is currently not enforced on PLC4X&#8217;s side.
So if a PLC would send more messages than agreed upon, these would still be processed.</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>controller-type</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>As part of the connection process, usually the PLC4X S7 driver would try to identify the remote device.
However some devices seem to have problems with this and hang up or cause other problems.
In such a case, providing the <code>controller-type</code> will skip the identification process and hereby avoid this type of problem.
Possible values are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>S7_300</code></p>
</li>
<li>
<p><code>S7_400</code></p>
</li>
<li>
<p><code>S7_1200</code></p>
</li>
<li>
<p><code>S7_1500</code></p>
</li>
<li>
<p><code>LOGO</code></p>
</li>
</ul>
</div></div></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="individual_resource_address_format">Individual Resource Address Format</h3>
<div class="paragraph">
<p>When programming Siemens PLCs, usually the tool used to do that is called TIA Portal.</p>
</div>
<div class="paragraph">
<p>The PLC4X S7 Driver is therefore sticking to the address format defined by this tool as it simplifies exchanging address information.</p>
</div>
<div class="sect3">
<h4 id="general_format">General Format</h4>
<div class="paragraph">
<p>In general all S7 addresses have this format:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>%{Memory-Area}{start-address}:{Data-Type}[{array-size}]</pre>
</div>
</div>
<div class="paragraph">
<p>If the array-part is omitted, the size-default of <code>1</code> is assumed.</p>
</div>
<div class="paragraph">
<p>Generally there are two types of addresses:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Bit-Addresses {Memory-Area-Code}{Start-Byte-Address}.{Bit-Offset}:BOOL[{Count}]</p>
</li>
<li>
<p>Byte-Addresses {Memory-Area-Code}{Start-Byte-Address}:{Data-Type-Code}[{count}]</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Bit addresses are only used if the datatype: <code>BOOL</code> is used.</p>
</div>
<div class="paragraph">
<p>The array notation of these can be omitted. In this case a <code>Count</code> of 1 is used per default.</p>
</div>
<div class="paragraph">
<p><code>Start-Byte-Address</code> and <code>Bit-Offset</code> in above list both represent unsigned integer values.</p>
</div>
<div class="paragraph">
<p>In case of accessing data in the <code>data block</code> memory area, the syntax is quite a bit more complex:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>DB{Data-Block-Number}.DB{Short-Data-Type-Code}{Start-Byte-Address}.{Bit-Offset}:BOOL[{Count}]</p>
</li>
<li>
<p>DB{Data-Block-Number}.DB{Short-Data-Type-Code}{Start-Byte-Address}:{Data-Type-Code}[{Count}]</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>When reading a <code>STRING</code> datatype, currently 254 characters would automatically be fetched from the PLC.</p>
</div>
<div class="paragraph">
<p>In order to limit the amount of data, we extended the <code>STRING</code> type declaration syntax to allow limiting this.</p>
</div>
<div class="paragraph">
<p>With the following format less than 254 characters can be read:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>DB{Data-Block-Number}.DB{Short-Data-Type-Code}{Start-Byte-Address}:STRING({string-length})[{Count}]</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>These addresses can usually be copied directly out of TIA portal.
However we also implemented a shorter version, as above version does have some unnecesary boilerplate parts (The <code>.DB</code> in the middle as well as the <code>Short-Data-Type-Code</code>)</p>
</div>
<div class="paragraph">
<p>The shorter syntax looks like this:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>DB{Data-Block-Number}:{Start-Byte-Address}.{Bit-Offset}:BOOL[{Count}]</p>
</li>
<li>
<p>DB{Data-Block-Number}:{Start-Byte-Address}:{Data-Type-Code}[{Count}]</p>
</li>
<li>
<p>DB{Data-Block-Number}:{Start-Byte-Address}:STRING({string-length})[{Count}]</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The S7 driver will handle both types of notation equally.</p>
</div>
</div>
<div class="sect3">
<h4 id="memory_areas">Memory Areas</h4>
<div class="paragraph">
<p>The S7 driver currently allows access to the following memory areas.</p>
</div>
<div class="paragraph">
<p>The <code>Code</code> column represents the code that is used in above general address syntax:</p>
</div>
<div class="paragraph">
<p>Not all S7 device types support the same full set of memory areas, so the last column gives more information on which types a given memory area is supported on.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 18.1818%;"/>
<col style="width: 18.1818%;"/>
<col style="width: 45.4545%;"/>
<col style="width: 18.1819%;"/>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Code</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Description</th>
<th class="tableblock halign-left valign-top">Supported PLC Types</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">C</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">COUNTERS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TIMERS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">D</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">DIRECT_PERIPHERAL_ACCESS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">I</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">INPUTS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Inputs (Digital and Analog &#8230;&#8203; usually Analog Inputs just have a start-address offset to separate them from the digital ones)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Q</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OUTPUTS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Outputs (Digital and Analog &#8230;&#8203; usually Analog Outputs just have a start-address offset to separate them from the digital ones)</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">M</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FLAGS_MARKERS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DB</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">DATA_BLOCKS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Memory areas containing user-defined data structures usually accessed by the integer data block number. Please note that data block addresses have a little more complex address format.</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DBI</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">INSTANCE_DATA_BLOCKS</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">LOCAL_DATA</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>TODO: Document this</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TODO: Document this</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect3">
<h4 id="data_types">Data Types</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 10%;"/>
<col style="width: 10%;"/>
<col style="width: 20%;"/>
<col style="width: 40%;"/>
<col style="width: 10%;"/>
<col style="width: 10%;"/>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Code</th>
<th class="tableblock halign-left valign-top">Short-Code</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Description</th>
<th class="tableblock halign-left valign-top">Size in bits</th>
<th class="tableblock halign-left valign-top"> Supported PLC Types</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top" colspan="6"><p class="tableblock">Bit-Strings (Will all interpreted as sequence of boolean values in PLC4X)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">BOOL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">X</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Bit</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Single boolean value</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">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">BYTE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Byte </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Array of 8 boolean values </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">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">WORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Word </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Array of 16 boolean values </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Double-Word </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Array of 32 boolean values </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Long-Word </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Array of 64 boolean values</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">S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="6"><p class="tableblock">Integer values</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">SINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Small int </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 bit integer (signed) </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">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">USINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Small unsigned int </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 bit integer (unsigned)</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">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">INT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">16 bit integer (signed)  </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Unsigned integer</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">16 bit integer (unsigned)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Double integer </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32 bit integer (signed) </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UDINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Unsigned Double Integer </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32 bit integer (unsigned) </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Long integer </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64 bit integer (signed)</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">S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">ULINT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Unsigned long integer</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64 bit integer (unsigned) </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">S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="6"><p class="tableblock">Floaring pooint values</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">REAL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Real </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32 bit IEEE 754 full precision floating point value (signed) </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LREAL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Long Real </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">64 bit IEEE 754 double precision floating point value (signed) </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">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="6"><p class="tableblock">Character values</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CHAR</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Character </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8 bit character </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">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">WCHAR</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Double byte character </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">16 bit character value </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">STRING</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String 2 + n bytes</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">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">WSTRING</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Double byte String  </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String of 16 bit characters 2 + n bytes</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">S7_1200, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="6"><p class="tableblock">Temporal values</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">S5TIME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S5 Time </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S5 Time (like in duration)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">S7_300, S7_400, S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">TIME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Time </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Time (like in duration) (Minutes, Seconds, Milliseconds) </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LTIME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Long Time </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Long Time (like in duration) (Minutes, Seconds, Milliseconds, Microseconds, Nanoseconds)  </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">S7_1500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DATE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Date </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Date</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">TIME_OF_DAY</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Time of day </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Time (like in 4:40PM) </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DATE_AND_TIME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Date and Time </p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Date and time (like in 03.05.2020 4:40 PM) </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">S7_300, S7_400, S7_1500</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect3">
<h4 id="s7_event_subscription">S7 Event Subscription</h4>
<div class="paragraph">
<p>The S7 driver allows the subscription to asynchronous events generated in the PLC.</p>
</div>
<div class="paragraph">
<p>This type of event is generated by S7-300, S7-400 controllers and VIPA devices. Unfortunately for the S7-1200 and S7-1500 series this functionality has been superseded.</p>
</div>
<div class="paragraph">
<p>For a complete list of compatibility between the S7-300,400 and S7-1200 &amp; S7-1500, you can see the document in [1] provided by Siemens.</p>
</div>
<div class="paragraph">
<p>In applications</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>MODE</code>: Change of operating state in the controller, change from STOP to RUN and vice versa.</p>
</li>
<li>
<p><code>SYS</code>: System events, associated with internal events of the controller or events previously parameterized for their indication.</p>
</li>
<li>
<p><code>USR</code>: Events programmed by the user and that are registered in the internal diagnostic buffer.</p>
</li>
<li>
<p><code>ALM</code>: Alarm events generated by the user program, ALARM_S, ALARM_8, NOTIFY.</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="diagnostic_request">Diagnostic request</h4>
<div class="paragraph">
<p>TODO</p>
</div>
</div>
<div class="sect3">
<h4 id="some_useful_tips">Some useful tips</h4>
<div class="paragraph">
<p>Especially when it comes to the input- and output addresses for analog channels, the start addresses are configurable and hereby don&#8217;t always start at the same address.
In order to find out what addresses these ports have, please go to the <code>device setting</code> of your PLC in <code>TIA Portal</code></p>
</div>
<div class="imageblock">
<div class="content">
<img src="../../images/users/protocols/s7-tia-device-settings.png" alt="devsettings" width="640" height="480"/>
</div>
</div>
<div class="paragraph">
<p>Especially pay attention to this part:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../../images/users/protocols/s7-tia-io-settings.png" alt="iosettings" width="600" height="144"/>
</div>
</div>
<div class="paragraph">
<p>In above image you can see that this device has 8 digital inputs (<code>DI 8</code>) and 2 analog inputs (<code>AI 2_1</code>) as well as 6 digital outputs (<code>DQ 6</code>).</p>
</div>
<div class="paragraph">
<p>The start addresses of the digital inputs and outputs start directly at <code>0</code>.</p>
</div>
<div class="paragraph">
<p>The analog inputs however start at address <code>64</code>.</p>
</div>
<div class="paragraph">
<p>Each digital input and output can be addresses by a single bit-address (start-address and offset) or can be read in a block by reading a full byte starting at the given start address without providing a bit offset.</p>
</div>
</div>
<div class="sect3">
<h4 id="resources">Resources</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><a href="https://support.industry.siemens.com/cs/document/109797648/simatic-comparison-list-for-s7-300-s7-400-s7-1200-s7-1500?dti=0&amp;lc=en-WW" class="bare">https://support.industry.siemens.com/cs/document/109797648/simatic-comparison-list-for-s7-300-s7-400-s7-1200-s7-1500?dti=0&amp;lc=en-WW</a></p>
</li>
</ol>
</div>
</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>