<!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>