Central API Module providing core interfaces and abstractions for unified access to industrial programmable logic controllers (PLCs)
—
Core connection lifecycle management, driver discovery, and connection establishment with authentication support for Apache PLC4X Java API.
Factory interface for discovering and creating PLC drivers and connections.
/**
* Main factory interface for PLC driver management and connection creation
*/
public interface PlcDriverManager {
/**
* Get the default driver manager instance
* @return Default PlcDriverManager implementation
*/
static PlcDriverManager getDefault();
/**
* Get all registered protocol codes
* @return Set of available protocol codes
*/
Set<String> getProtocolCodes();
/**
* Get a specific driver by protocol code
* @param protocolCode Protocol identifier (e.g., "modbus-tcp", "s7")
* @return PlcDriver instance
* @throws PlcConnectionException If protocol is not supported or driver cannot be created
*/
PlcDriver getDriver(String protocolCode) throws PlcConnectionException;
/**
* Get driver for a specific connection URL
* @param url Connection URL
* @return PlcDriver instance
* @throws PlcConnectionException If protocol is not supported or driver cannot be created
*/
PlcDriver getDriverForUrl(String url) throws PlcConnectionException;
/**
* Get the connection manager interface
* @return PlcConnectionManager instance
*/
PlcConnectionManager getConnectionManager();
}Default implementation of PlcDriverManager and PlcConnectionManager.
/**
* Default implementation providing driver discovery and connection creation
*/
public class DefaultPlcDriverManager implements PlcDriverManager, PlcConnectionManager {
/**
* Create driver manager using current context classloader
*/
public DefaultPlcDriverManager();
/**
* Create driver manager with custom classloader for driver discovery
* @param classLoader Classloader for driver discovery
*/
public DefaultPlcDriverManager(ClassLoader classLoader);
}Simplified interface for connection management.
/**
* Interface for connection management providing methods to create and manage PLC connections
*/
public interface PlcConnectionManager {
/**
* Create a connection from a connection URL
* @param url Connection URL (e.g., "modbus-tcp://192.168.1.100:502")
* @return PlcConnection instance
* @throws PlcConnectionException If connection cannot be established
*/
PlcConnection getConnection(String url) throws PlcConnectionException;
/**
* Create an authenticated connection from a connection URL
* @param url Connection URL
* @param authentication Authentication credentials
* @return PlcConnection instance
* @throws PlcConnectionException If connection cannot be established
*/
PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException;
}Main connection interface for PLC communication.
/**
* Main connection interface extending AutoCloseable for resource management
*/
public interface PlcConnection extends AutoCloseable {
/**
* Establish the connection to the PLC
* @throws PlcConnectionException If connection fails
*/
void connect() throws PlcConnectionException;
/**
* Check if connection is currently active
* @return true if connected, false otherwise
*/
boolean isConnected();
/**
* Close the connection and release resources
* @throws Exception If closing fails
*/
void close() throws Exception;
/**
* Parse a tag address string into a PlcTag object
* @param tagAddress String representation of tag address
* @return Optional PlcTag if parsing succeeds
*/
Optional<PlcTag> parseTagAddress(String tagAddress);
/**
* Parse values for a specific tag
* @param tag The PlcTag to parse values for
* @param values Raw values to parse
* @return Optional PlcValue if parsing succeeds
*/
Optional<PlcValue> parseTagValue(PlcTag tag, Object... values);
/**
* Get connection metadata including supported capabilities
* @return PlcConnectionMetadata with capability information
*/
PlcConnectionMetadata getMetadata();
/**
* Ping the PLC connection
* @return CompletableFuture with ping response
*/
CompletableFuture<? extends PlcPingResponse> ping();
/**
* Create a read request builder
* @return PlcReadRequest.Builder instance
*/
PlcReadRequest.Builder readRequestBuilder();
/**
* Create a write request builder
* @return PlcWriteRequest.Builder instance
*/
PlcWriteRequest.Builder writeRequestBuilder();
/**
* Create a subscription request builder
* @return PlcSubscriptionRequest.Builder instance
*/
PlcSubscriptionRequest.Builder subscriptionRequestBuilder();
/**
* Create an unsubscription request builder
* @return PlcUnsubscriptionRequest.Builder instance
*/
PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder();
/**
* Create a browse request builder
* @return PlcBrowseRequest.Builder instance
*/
PlcBrowseRequest.Builder browseRequestBuilder();
}Extended connection interface with event listener support.
/**
* Extended connection interface for event-driven communication
*/
public interface EventPlcConnection extends PlcConnection {
/**
* Add an event listener for connection events
* @param listener EventListener implementation
*/
void addEventListener(EventListener listener);
/**
* Remove an event listener
* @param listener EventListener to remove
*/
void removeEventListener(EventListener listener);
}Protocol-specific driver interface.
/**
* Protocol-specific driver interface
*/
public interface PlcDriver {
/**
* Get the protocol short code
* @return Protocol identifier (e.g., "modbus-tcp", "s7")
*/
String getProtocolCode();
/**
* Get the full protocol name
* @return Human-readable protocol name
*/
String getProtocolName();
/**
* Get driver metadata including capabilities
* @return PlcDriverMetadata with driver information
*/
PlcDriverMetadata getMetadata();
/**
* Create a connection using this driver
* @param url Connection URL
* @return PlcConnection instance
* @throws PlcConnectionException If connection cannot be established
*/
PlcConnection getConnection(String url) throws PlcConnectionException;
/**
* Create an authenticated connection using this driver
* @param url Connection URL
* @param authentication Authentication credentials
* @return PlcConnection instance
* @throws PlcConnectionException If connection cannot be established
*/
PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException;
/**
* Prepare a tag from an address string
* @param tagAddress Tag address string
* @return PlcTag instance
* @throws PlcInvalidTagException If tag address is invalid
*/
PlcTag prepareTag(String tagAddress) throws PlcInvalidTagException;
/**
* Create a discovery request builder for this driver
* @return PlcDiscoveryRequest.Builder instance
*/
PlcDiscoveryRequest.Builder discoveryRequestBuilder();
}Usage Examples:
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.PlcConnectionManager;
import org.apache.plc4x.java.api.PlcDriverManager;
import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication;
// Basic connection
PlcDriverManager driverManager = new DefaultPlcDriverManager();
PlcConnectionManager connectionManager = driverManager.getConnectionManager();
try (PlcConnection connection = connectionManager.getConnection("modbus-tcp://192.168.1.100:502")) {
connection.connect();
System.out.println("Connected: " + connection.isConnected());
// Use connection for operations...
} // Auto-close when done
// Authenticated connection
PlcUsernamePasswordAuthentication auth = new PlcUsernamePasswordAuthentication("admin", "password");
try (PlcConnection connection = connectionManager.getConnection("s7://192.168.1.200/0/1", auth)) {
connection.connect();
// Check capabilities
if (connection.getMetadata().isReadSupported()) {
// Perform read operations
}
}
// Driver discovery
Set<String> protocols = driverManager.getProtocolCodes();
System.out.println("Available protocols: " + protocols);
PlcDriver modbusDriver = driverManager.getDriver("modbus-tcp");
System.out.println("Driver: " + modbusDriver.getProtocolName());public interface PlcPingRequest extends PlcRequest {
CompletableFuture<? extends PlcPingResponse> execute();
}
public interface PlcPingResponse extends PlcResponse {
PlcRequest getRequest();
}public interface PlcConnectionMetadata {
boolean isReadSupported();
boolean isWriteSupported();
boolean isSubscribeSupported();
boolean isBrowseSupported();
}
public interface PlcDriverMetadata {
Optional<String> getDefaultTransportCode();
List<String> getSupportedTransportCodes();
Optional<OptionMetadata> getProtocolConfigurationOptionMetadata();
Optional<OptionMetadata> getTransportConfigurationOptionMetadata(String transportCode);
boolean isDiscoverySupported();
}public interface PlcTag {
String getAddressString();
PlcValueType getPlcValueType();
List<ArrayInfo> getArrayInfo();
}
public interface ArrayInfo {
int getSize();
int getLowerBound();
int getUpperBound();
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-plc4x--plc4j-api