blob: ef87b1f54fadfb62c890dc6ac272e051634fc302 [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">
<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">
<main role="main" class="ml-sm-auto px-4 w-100 h-100">
<meta name="go-import" content="plc4x.apache.org/plc4go git https://github.com/apache/plc4x/plc4go">
<meta name="go-source" content="plc4x.apache.org/plc4go https://github.com/apache/plc4x/plc4go https://github.com/apache/plc4x/tree/release/plc4go{/dir} https://github.com/apache/plc4x/tree/release/plc4go{/dir}/{file}#L{line}">
<div class="sect1">
<h2 id="about_plc4go">About PLC4Go</h2>
<div class="sectionbody">
<div class="paragraph">
<p><code>PLC4Go</code> is a sub-project of <code>PLC4X</code> with implementations based on <code>Go</code>.</p>
</div>
<div class="paragraph">
<p>One of PLC4X&#8217;s core principals is, that an application using PLC4X should be independent of the PLC or protocol being used.</p>
</div>
<div class="paragraph">
<p>When addressing a resource on a remote there are two parts that are dependent on the protocol and the type of PLC:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Addressing the PLC itself</p>
</li>
<li>
<p>Addressing a resource on the PLC</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Providing this independence to addressing the PLC itself is completely handled by the <code>PlcDriverManager</code> the application requests a connection from.</p>
</div>
<div class="paragraph">
<p>Hereby the design of the <code>url string</code> passed to the <code>getConnection</code> method is greatly inspired by <code>JDBC</code>.</p>
</div>
<div class="paragraph">
<p>The protocol prefix of the url specifies the type of driver being used.</p>
</div>
<div class="paragraph">
<p>For example, when connecting to a Siemens PLC using the S7/Step7 Protocol, the url: <code>s7://192.42.0.98/1/2</code> causes the driver manager to create a S7 connection instance.
The part behind the <code>:</code> is hereby used by the driver implementation to configure that particular connection.</p>
</div>
<div class="paragraph">
<p>For a S7 connection, for example, this is <code>IP address/host name</code>/<code>rack number</code>/<code>slot number</code>. For different types of connections this url structure will greatly differ.</p>
</div>
<div class="paragraph">
<p>As mentioned above, the second platform dependent information is the address of resources on a PLC.
The format of an address greatly depends on the type of connection. Therefore <code>parseAddress</code> is one of the only methods defined in the <code>PlcConnection</code> interface any connection has to implement.</p>
</div>
<div class="paragraph">
<p>This method returns an object implementing the <code>Address</code> interface which then can be used by the same connection to identify remote resources.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../images/plc4x-architecture.png" alt="plc4x architecture" width="1000" height="574"/>
</div>
</div>
<div class="sect2">
<h3 id="usage">Usage</h3>
<div class="paragraph">
<p>Below code example connects to a remote Siemens S7 PLC using the S7/Step7 protocol and then reads the state of the <code>inputs</code> and <code>outputs</code> from this.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code data-lang="go">func HellpPlc4go() {
driverManager := plc4go.NewPlcDriverManager()
driverManager.RegisterDriver(modbus.NewModbusDriver())
driverManager.RegisterTransport(tcp.NewTcpTransport())
// Get a connection to a remote PLC
crc := driverManager.GetConnection("modbus-tcp://192.168.23.30")
// Wait for the driver to connect (or not)
connectionResult := &lt;-crc
if connectionResult.Err != nil {
t.Errorf("error connecting to PLC: %s", connectionResult.Err.Error())
return
}
connection := connectionResult.Connection
// Try to ping the remote device (This block is just optional)
pingResultChannel := connection.Ping()
pingResult := &lt;-pingResultChannel
if pingResult.Err != nil {
t.Errorf("couldn't ping device: %s", pingResult.Err.Error())
return
}
// Make sure the connection is closed at the end
defer connection.Close()
// Prepare a read-request
readRequest, err := connection.ReadRequestBuilder().
AddItem("field1", "holding-register:1:REAL").
AddItem("field2", "holding-register:3:REAL").
Build()
if err != nil {
t.Errorf("error preparing read-request: %s", connectionResult.Err.Error())
return
}
// Execute a read-request
rrc := readRequest.Execute()
// Wait for the response to finish
rrr := &lt;-rrc
if rrr.Err != nil {
t.Errorf("error executing read-request: %s", rrr.Err.Error())
return
}
// Do something with the response
value := rrr.Response.GetValue("field")
// Do something sensible with the information
fmt.Printf("\n\nResult: %f\n", value)
}</code></pre>
</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>