blob: f0ba8cd72c4dae3713f12d15831fe0b41c87f7a4 [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.
//
== Abstract
PLC4X is intended to become a set of libraries for communicating with industrial programmable logic controllers (PLCs) using a variety of protocols but with a shared API.
For the most used of these protocols, PLC4X will provide implementations of drivers. Each protocol driver is hereby provided by an individual artifact.
In a first step, we are concentrating on Java but will be hoping to be able to port implementation to C and other languages.
== Background
Industrial machines have been controlled by PLCs for more than 30 years. In simpler pieces of machinery these may operate autonomously, in more complex ones several to hundreds of these industrial computers communicate with each other.
== Rationale
Currently software for communicating with PLCs is mainly proprietary software and a whole ecosystem of closed-source solutions exist. Usually this software is very expensive and licensing implies a lot of restrictions on its usage. There is a small set of open-source libraries available, but unfortunately most of these are GPL licensed and hereby disqualify themselves from commercial use. Most of these are direct ports from C/C++ implementations and therefore inherit their API. Usually these are implemented blocking socket operations and have great problems with concurrency. Also, the APIs of these tools differ quite a lot, so porting a software from communicating with one type of PLC to another sometimes requires re-writing a great part of the software.
There are multiple rationales behind this project:
1. By providing libraries with Apache license, it will be possible to create commercial applications which access PLCs
2. By providing a universal API for different protocols, it reduces the vendor lock-in when creating software
3. Most of the proprietary commercial solutions are based on Windows systems, especially the Siemens solutions, sometimes require maintaining un-patched versions of older Windows version in order to run, this is a huge security risk (See Stuxnet)
4. Most of the proprietary commercial solutions don't scale. Running them in public/private clouds and/or in containers is completely out of the question.
As a result of above, it would be possible to start writing secure, scalable and reliable software using the full stack of open-source solutions and hereby open a complete new market for developers. In order to make this even easier, we are planning on directly providing adapters and examples for using PLC4X together with other Apache frameworks.
== Initial Goals
Develop a universal API for accessing industrial programmable logic controllers in a protocol-agnostic way. Also implement Java versions of drivers for the most prominent protocols: S7, Modbus and OPC-UA - but not limited to those. On the side of the adapters, for existing OS solutions, we are currently working on adapters for: Apache Edgent (incubating), Apache Camel and eventually even Apache Brooklyn.
Also, we will be providing a Scala wrapper to ease integration of PLC4X in Scala based systems with an API Scala developers should easily adopt.
As soon as a C version exists, we are planning on providing an Apache Mynewt adapter as we see great benefits on this combination.
== Current Status
=== Meritocracy
PLC4X was initially created by Christofer Dutz. He is an Apache Member and also involved in a variety of Apache and Non-Apache Open-Source projects. Being PMC of the Apache Flex, Apache Kibble and the Apache Travel Assistance he definitely knows how Apache works and is a strong advocate of the Apache Way. He is also currently helping the Apache Edgent project as member of the PPMC. However, the team working on PLC4X also includes a diverse set of additional Apache Committers and Members as well as people, that are not yet affiliated with any Apache project. The team working on PLC4X are both working for codecentric as well as other entities, such as commercial companies as well as universities.
=== Community
Currently the PLC4X community exists out of a set of core developers working on a private code repository provided by codecentric (the company Christofer Dutz is working for). However, the set of developers, working on PLC4X is not limited to codecentric employees as we are also inviting outside contributors.
The main reason for using a private repo instead of a public one, is that we were planning on starting incubation at Apache within a few weeks after initiating the project. Therefore, we wanted to start writing everything with Apache package names and Apache Maven coordinates. Even our logo is directly designed including the Apache Feather and "Apache" inside the name. As only real Apache projects are allowed to use "Apache", we decided to go down the private repository path.
=== Core Developers
(In alphabetical order)
- Benedikt Ritter (codecentric) (Apache Member)
- Christofer Dutz (codecentric) (Apache Member)
- Dale LaBossiere (IBM) (PPMC Member of the Apache Edgent incubator podling)
- Frank Stibane (codecentric)
- Greg Trasuk (Web Age Solutions) (Apache Member)
- Justin McLean (External) (Apache Member)
- Kai Herings (codecentric)
- Lukas Friedrichsen (Hochschule Bochum)
- Mark Keinhörster (codecentric)
- Rolf Felker (codecentric)
- Sebastian Rühl (codecentric)
=== Alignment
The build system is based on Apache Maven. Also, it uses Apache Edgent (incubating) and Apache Camel libraries for providing adapters to these systems. Being a full-blown Apache enthusiast, for Christofer there hasn't been any thought in bringing this project into any other collaboration platform or foundation. This idea is shared by a big majority of the core contributors.
=== Project Name
As we know that renaming a codebase can be a huge pain, we have invested quite a lot of time into finding a suitable name. In the end, we came up with a list of about 20 project names, which we did the fully required background checks for. On the options surviving these checks, we internally voted on the name. It was a pretty close tie between PLC4J and PLC4X, but we decided to go for the later as we are planning on providing libraries for multiple languages beyond Java.
PLC4X has no registered trademarks that we could find and the only potential problem would be a hardware LPT Breakout Board by a Russian Company called Purelogic (https://purelogic.ru/doc/PDF/Controller/PLC4x.pdf) English version (http://www.zappautomation.co.uk/productattachments/index/download?id=99)
But we don't see any problems to arise from this. If there would be problems, we would probably fallback to using PLC4J, which had no conflicts at all and would eventually name our sub-products PLC4S (Scala) and PLC4C (C/C++).
== Known Risks
=== Orphaned projects
PLC4X is a new Project, which has just been started. The feedback from the industry has been overwhelming so the risk of the project being orphaned is minimal.
=== Inexperience with Open Source
The set of core developers of this project consists of a large set of experienced open-source developers, most of these even being Apache Members.
=== Homogeneous Developers
Even if a big part of the projects initial committer team is affiliated with codecentric, we have been successful and continuing to be in actively recruiting people from other commercial and non-commercial entities.
=== Reliance on Salaried Developers
Currently only Christofer Dutz is being paid to work on this project exclusively.
=== Relationships with Other Apache Products
PLC4X makes great used of Apache Maven for the build system and Apache Commons for providing a lot of basic functionality.
Also does it currently have direct relations to the Apache Camel and Apache Edgent projects as it provides modules for direct integration of PLC4X into these frameworks.
In the future we are planning on also adding such modules for Apache Brooklyn and as soon as a C-based version of PLC4X is available Apache Mynewt.
Currently there is no competing project at the Apache Software Foundation.
=== An Excessive Fascination with the Apache Brand
We are certain that PLC4X itself will profit from being an official Apache project, in terms of attracting a community and establishing a solid group of developers and users, but also to ease the interaction with other Apache projects, used in PLC4X or project PLC4X provides adapters for as all will share the same base.
Our general belief in the Apache way as well as the reasons mentioned above are the main reasons for us to send this proposal. We think that a good community is needed to build and maintain good software, such as PLC4X. Also do we need a big community to support a big variety of systems. However, even if PLC4X would not be accepted, development would definitely continue elsewhere. Apache is just our primary foundation of choice. As such, there is no need to, or reason to, "abuse" the Apache Brand.
=== Possibility of legal actions
Some of the protocols are not publicly defined. Existing open-source implementations contain licensing restrictions. To avoid licensing issues we made sure the license of information used to implement drivers in PLC4X are compatible with the Apache license and added references to these sources in the project documentation to prove this. This documentation is part of the codebase. We are therefore not expecting any real problems on this side.
=== Test setup could require hardware
A test-suite for PLC4X could involve tests run against virtual or real hardware. It could be problematic to include these in automated builds run on build.apache.org, but Apache infra have already signaled that there should be options to work this out.
== Documentation
Currently all documentation and information is stored alongside the code in a private corporate GIT repository and is available as part of the website which is generated as part of the build.
== Initial Source
Development of PLC4X started at codecentric in October of 2017. The source currently is located on a private corporate GIT repository. All the code is available at https://gitlab.codecentric.de/iot/plc4x (Accounts can be created on a request basis)
== Source and Intellectual Property Submission Plan
PLC4X is currently mainly developed by, but not limited to, codecentric employees. However, all code has been developed completely from scratch it was ensured from the start that each document is already fully licensed under the Apache 2.0 license. All source will be donated to Apache without any exceptions.
== External Dependencies
- Apache Commons-IO, Apache License 2.0
- Apache Edgent, Apache License 2.0
- Netty, Apache License 2.0
- Metrics Core, Apache License 2.0
- Google Gson, Apache License 2.0
This source can be included, according to http://www.apache.org/legal/3party.html
- Logback, EPL 1.0
This source can NOT be included, according to http://www.apache.org/legal/3party.html
== Cryptography
Not applicable.
== Required Resources
=== Mailing Lists
- plc4x-dev
- plc4x-user
- plc4x-private
We think that a separate user list is advisable, as this project targets a sector in software development where we are expecting questions from non-typical software developers. The world of PLCs and the production industry differs greatly from the world we usually work in, therefore we don't want to distract and confuse these new community members with implementation details and keep the vetting of these new members from the developer discussions.
=== Git Repository
https://git-wip-us.apache.org/repos/asf/incubator-plc4x.git
=== Issue Tracking
JIRA PLC4X
=== Confluence Wiki
To be able to provide help, documentation, faq etc, a wiki is needed.
== Initial Committers
(In alphabetical order)
- Benedikt Ritter (britter@apache.org)
- Christofer Dutz (cdutz@apache.org)
- Dale LaBossiere (dlaboss@apache.org)
- Frank Stibane (frank.stibane@codecentric.de)
- Greg Trasuk (gtrasuk@apache.org)
- Justin McLean (jmclean@apache.org)
- Kai Herings (kai.herings@codecentric.de)
- Lukas Friedrichsen (friedrichsen.luk@googlemail.com)
- Mark Keinhörster (mark.keinhoerster@codecentric.de)
- Rolf Felker (rolf.felker@codecentric.de)
- Sebastian Rühl (sebastian.ruehl@codecentric.de)
== Affiliations
Currently most of the initial committers are employees of codecentric. Currently Christofer Dutz is the only contributor paid to work on PLC4X full-time. The others participate as part of their so-called "+1 time" (At codecentric employees get to spend 20% of their time to work on open-source, education, etc. and they invest a lot of this time on the project).
Besides these we also have contributors from companies other than codecentric (Dale, Greg, Justin) as well as universities (Lukas).
== Sponsors
=== Champion
- Justin McLean
=== Nominated Mentors
(In alphabetical order)
- Greg Trasuk
- Justin McLean
- Luciano Resende
- Stefan Bodewig
=== Sponsoring Entity
PLC4X is a new project and proposed is to release to code under the sponsorship of the Incubator.
== Status
First draft