blob: dcc6862e40a5309aaa297014bbf4cc2932c5ce73 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
:imagesdir: images/
== About PLC4J
`PLC4J` is a sub-project of `PLC4X` with implementations based on `Java` targeted at runtimes for `Java 1.8` or above.
One of PLC4X's core principals is, that an application using PLC4X should be independent of the PLC or protocol being used.
When addressing a resource on a remote there are two parts that are dependent on the protocol and the type of PLC:
- Addressing the PLC itself
- Addressing a resource on the PLC
Providing this independence to addressing the PLC itself is completely handled by the `PlcDriverManager` the application requests a connection from.
Hereby the design of the `url string` passed to the `getConnection` method is greatly inspired by `JDBC`.
The protocol prefix of the url specifies the type of driver being used.
For example, when connecting to a Siemens PLC using the S7/Step7 Protocol, the url: `s7://192.42.0.98/1/2` causes the driver manager to create a S7 connection instance.
The part behind the `:` is hereby used by the driver implementation to configure that particular connection.
For a S7 connection, for example, this is `IP address/host name`/`rack number`/`slot number`. For different types of connections this url structure will greatly differ.
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 `parseAddress` is one of the only methods defined in the `PlcConnection` interface any connection has to implement.
This method returns an object implementing the `Address` interface which then can be used by the same connection to identify remote resources.
[ditaa,plc4x-architecture]
....
+----------------------------------------------------------------------------------------------+
|c05A |
| |
| User Application |
| |
| |
| +-----------+------------------+------------------+------------------+------+
| | | | | |
| | | | | |
| | v v v v
| | +-------------+ +-------------+ +-------------+ +-------------+
| | |c0BA | |c0BA | |c0BA | |c0BA |
| | | Apache | | Apache | | Apache | | Apache |
| | | Kafka | | Camel | | Edgent | | Nifi |
| | | Connect | | Integration | | Integration | | Integration |
| | | | | | | | | |
+---------+--------+ +------+------+ +------+------+ +------+------+ +------+------+
| | | | |
| | | | |
v v v v v
+----------------------------------------------------------------------------------------------+
|cAAA |
| |
| PLC4X API |
| |
| |
+------+---------------+---------------+---------------+---------------+---------------+-------+
| | | | | |
| | | | | |
v v v v v v
+-----------+ +-----------+ +-----------+ +-----------+ +-----------+ +-----------+
|c0BA | |c0BA | |c0BA | |c0BA | |c0BA | |c05A |
| Siemens | | Beckhoff | | Modbus | | OPC UA | | Emerson | | User |
| S7 | | ADS | | Driver | | Driver | | DeltaV | | Driver |
| Driver | | Driver | | | | | | Driver | | |
| | | | | | | | | | | |
+-----------+ +-----------+ +-----------+ +-----------+ +-----------+ +-----------+
....
=== Usage
Below code example connects to a remote Siemens S7 PLC using the S7/Step7 protocol and then reads the state of the `inputs` and `outputs` from this.
It also demonstrates two ways this information can be accessed:
- Synchronously (The application pauses, till the response is received)
- Asynchronously (The application continues and can
[source,java]
----
include::../../../../examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java[lines=19..200]
----