blob: 652dba659600ed0994f6e6e3315d09aade4d5cd9 [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">
<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">
<strong class="nav-link">Industry 4.0 with Apache</strong>
</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="industry_4_0_with_apache">Industry 4.0 with Apache</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Since the introduction of programmable logic controllers in the production industry in the early 80s, they have been the core of almost every piece of production machinery.</p>
</div>
<div class="paragraph">
<p>While first PLCs were usually stand-alone controllers.
These were soon extended by the ability to talk to other controllers of the same type via proprietary protocols.
After that came first computer based control systems, which were able to monitor and parametrize these controllers.
Usually however in order to do this, a company needed to use the control system that was provided by the PLC vendor.
This has tied companies to stick to the company they decided to use the PLCs of.
Making it almost impossible to switch to another vendor.</p>
</div>
<div class="paragraph">
<p>In the last 20 years in the IT industry, the concept of open source has come up and has more and more proven to be the engine of great innovation.
Most of the biggest changes in how we create modern IT systems is a result of this.</p>
</div>
<div class="paragraph">
<p>Unfortunately the production industry has been missing a lot of this innovation.
Only a small number of companies today use open source software in their production systems.</p>
</div>
<div class="sect2">
<h3 id="benefits_of_using_open_source">Benefits of using open source</h3>
<div class="paragraph">
<p>The benefit of using open source could be huge:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Increased Flexibility</p>
</li>
<li>
<p>Increased Stability</p>
</li>
<li>
<p>Increased Extendability</p>
</li>
<li>
<p>Improved Security</p>
</li>
<li>
<p>Great Cost reduction</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="increased_flexibility">Increased Flexibility</h4>
<div class="paragraph">
<p>If a company had decided to use PLCs and control systems of a certain vendor, it is almost impossible to change this decision.
This reduces the options available when adding new machinery or replacing existing ones.</p>
</div>
<div class="paragraph">
<p>Technologically speaking, also the company can only use the options and solution it&#8217;s vendor is able to provide.</p>
</div>
</div>
<div class="sect3">
<h4 id="increased_stability">Increased Stability</h4>
<div class="paragraph">
<p>Current control systems are usually based on the concept of "backup systems".
If the main control system fails, all activity is switched to the standby system.</p>
</div>
<div class="paragraph">
<p>When using modern public- or private cloud systems, there is no need for a backup system, because the cluster is designed in a way that it can live with the failure of most of its hosts before loosing the ability to function.</p>
</div>
</div>
<div class="sect3">
<h4 id="increased_extendability">Increased Extendability</h4>
<div class="paragraph">
<p>From the perspective of designing and scaling the IT infrastructure:
If a control system was designed to handle the current size of plant, for cost reasons the IT infrastructure isn&#8217;t designed to handle much more than that.
Now if the plant should be extended in the future, extending it&#8217;s control-systems IT infrastructure would probably result in replacing this with a bigger system.</p>
</div>
<div class="paragraph">
<p>By utilizing modern virtualization frameworks, extending the existing cloud solution, would only require adding more compute resources, by adding more systems to the cluster and it should be possible to extend the existing system without problems.
If the company decided to utilize a public cloud provider, it makes things even simpler, as it would only require booking more resources.</p>
</div>
</div>
<div class="sect3">
<h4 id="improved_security">Improved Security</h4>
<div class="paragraph">
<p>This is probably one of the most concerning aspects of modern production control systems.
Right now, in order to run these systems, a lot of the most popular solutions require companies to run not up to date systems.
If applying all updates, the company is risking either loss of commercial support or even loss of functionality.
Therefore an attacker can probably be certain to be able to exploit certain vulnerabilities just by knowing the type and version of the used control system.</p>
</div>
</div>
<div class="sect3">
<h4 id="cost_reduction">Cost Reduction</h4>
<div class="paragraph">
<p>Well the probably biggest and most obvious cost reduction factor is definitely, that if the software you are using is free, you will not have to pay for it.</p>
</div>
<div class="paragraph">
<p>Additionally, the ability to get the computing power of one insanely expensive system by using a cluster of cheap commodity systems, helps saving a lot of money.</p>
</div>
<div class="paragraph">
<p>Being freed of the requirement to stick to the products of one vendor alone and to be able to choose the technology and the vendor of used systems freely will definitely also reduce costs.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="options_to_communicating_with_plcs">Options to communicating with PLCs</h3>
<div class="paragraph">
<p>In general there are two options for communicating with industrial PLCs:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Using a protocol converter</p>
<div class="ulist">
<ul>
<li>
<p>Hardware protocol converter</p>
</li>
<li>
<p>Software protocol converter</p>
</li>
</ul>
</div>
</li>
<li>
<p>Using a driver for direct communication</p>
<div class="ulist">
<ul>
<li>
<p>Commercial drivers</p>
</li>
<li>
<p>Open source drivers</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Well protocol converters are all software in the end, but while a "hardware converter" is usually a closed hardware box that runs some sort of software, a "software converter" is usually an installable service or program that runs on a host system.</p>
</div>
<div class="paragraph">
<p>In both cases the configuration of the protocol converter tells the system which information to get and how to make that available in another protocol.
It usually doesn&#8217;t allow full access to all information available in a PLC, but only the ones the adapter is configured to make available.
Here, there is a big trade-off. If a system should be used in the most versatile way, also the most information has to be made available.
Even if most of this information is never needed.
Limiting the system only to the needed information, greatly reduces the systems versatility.</p>
</div>
<div class="paragraph">
<p>Another disadvantage is a slightly increased latency when making information available.
This is due to the fact that the protocol converter has to send a request to the PLC to get information and as soon as this information is returned to the converter this new information can only be passed on in the other protocol in the next request.</p>
</div>
<div class="paragraph">
<p>The usage of a protocol converter is probably the ideal solution, if all a company wants to do, is integrate PLCs communicating in one protocol into an existing system using a different protocol.
In case of integrating open source software, this usually is a protocol converter that converts into one of the well established open source protocols.
The most widely used protocol here currently will probably be <code>MQTT</code>.</p>
</div>
<div class="paragraph">
<p>The option that provides the most possibilities is directly communicating with the PLCs.
Here the system can always directly access only the exact information required and can do this without any detours that would add latency.</p>
</div>
<div class="paragraph">
<p>There is a wide variety of drivers available, that generally would allow writing software that directly accesses PLCs.
Unfortunately most of these are commercial drivers.</p>
</div>
<div class="paragraph">
<p>While there is a number of open source drivers, most of these have licenses that render them useless for commercial applications.
Either they are licensed with restrictive licenses such as GPL or they are dual licensed with a restriction to non-commercial usage for the open source version and the requirement to purchase a commercial license for commercial use cases.</p>
</div>
<div class="paragraph">
<p>The APIs of all drivers usually differs quite greatly from each one another. This makes it extremely difficult to create solutions that work with a variety of PLCs and protocols.</p>
</div>
<div class="paragraph">
<p>This is where <code>Apache PLC4X</code> comes in. It is the goal of <code>PLC4X</code> to provide a suite of drivers for communicating with industrial PLCs using a variety of protocols, but with a shared API and a license model, that is suitable for creating commercial applications.</p>
</div>
<div class="paragraph">
<p>Hereby <code>PLC4X</code> forms the missing link between the automation and the open source world.
Making it possible to use the entire stack of open source technologies to create a new generation of open industrial control systems.</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>