PLCcom for S7
Symbolic S7 Access for .net and java Developers
The PLCcom for S7 library is a highly optimized component specially designed for java and .net software developers, which has been created 100% under .net or java. The component enables developers under the programming platforms .net or java a comfortable and program-controlled access to S7 PLC data.
Depending on the control unit, access is via
- Put/Get or
- symbolically using legacy access to older controllers
- or symbolic access via Secure Communication (TLS encrypted) on newer generation devices.
PLCcom for S7 is compatible with S7 controllers (200, 300, 400, 1200, 1500 series, ET200SP, SoftSPS WinAC RTX, and Logo! 0BA7, 0BA8 0BA0, 0BA1, 0BA2, as well as CPUs from other manufacturers (e.g., VIPA 100V/200V/300V/300S, etc.).
The libraries support the protocols Profinet, MPI and PPI (see data sheet)
The component is certified in accordance with the requirements of the Cyber Resilience Act (EU 2024/2847) – CRA for short.
You can find the relevant certificates on the download page.
PLCcom for S7 is available for two programming platforms:
-
- .net-Version
The .net version supports both the classic .net Framework-programming from Framework Version 4.7.2 als auch modernere Frameworks bis hin zu .net 10.0.
The delivery package contains libraries for the classic .net Framework versions 4.7.2 and 4.8. There are also versions for .net-Standard Version 2.1 and versions for .net 5.0, .net 6.0, .net 7.0, .net 8.0, .net 9.0 , .net 10.0 in the delivery package.
PLCcom for S7 (.net version) is provided via a Nuget package. - java-Version
The java version provides developers with a library that can be seamlessly integrated into java-based applications and is compatible with common development environments such as Eclipse or NetBeans. It supports java JRE / OpenJRE from Version 11.23 and has been tested up to Version 25 .
PLCcom for S7 (java version) is provided via Maven Central Repository.
- .net-Version
PLCcom for S7 delivers high performance
PLC communication is never “free”: no matter which protocol you use, every access creates communication and processing overhead on the PLC and can impact PLC cycle time at high polling rates.
During development, great care was taken to ensure that all components and algorithms execute as efficiently as possible.
Smart optimizations in the library reduce communication overhead — which lowers PLC load and keeps cycle times stable.
- Accesses are efficiently bundled instead of being transferred individually.
- Reduced number of telegrams for frequent polling.
- Optional parallelization when maximum data rate is required.
The result: maximum data rate with minimal PLC load — ideal for HMI/SCADA systems, data logging, and any application that reads many variables at short intervals.
For a quick start, you’ll find runnable example projects for .NET and Java in our GitHub-Repositories.
Below are two simple code examples to illustrate this:
// Create a device instance
Tls13Device tlsDevice = new Tls13Device("192.168.1.100");
//connect
ConnectResult connectResult = tlsDevice.Connect();
// Which variables do you want to read?
ReadSymbolicRequest readRequest = new ReadSymbolicRequest();
readRequest.AddFullVariableName("DataBlock_1.ByteValue");
readRequest.AddFullVariableName("DataBlock_1.RealValue");
// Read from device
var readResult = tlsDevice.ReadData(readRequest);
// Evaluate results
if (readResult.Quality == OperationResult.eQuality.GOOD)
{
foreach (PlcCoreVariable variable in readResult.Variables)
{
Console.WriteLine($"{variable.VariableDetails.FullVariableName} Value: {variable.Value}");
}
}
else
{
Console.WriteLine($"Read not successfull! Message: {readResult.Message}");
}
' Create a device instance
Dim tlsDevice As New Tls13Device("192.168.1.100")
' connect
Dim connectResult As ConnectResult = tlsDevice.Connect()
' Which variables do you want to read?
Dim readRequest As New ReadSymbolicRequest()
readRequest.AddFullVariableName("DataBlock_1.ByteValue")
readRequest.AddFullVariableName("DataBlock_1.RealValue")
' Read from device
Dim readResult = tlsDevice.ReadData(readRequest)
' Evaluate results
If readResult.Quality = OperationResult.eQuality.GOOD Then
For Each variable As PlcCoreVariable In readResult.Variables
Console.WriteLine($"{variable.VariableDetails.FullVariableName} Value: {variable.Value}")
Next
Else
Console.WriteLine($"Read not successfull! Message: {readResult.Message}")
End If
//create a device instance
Tls13Device tlsDevice = new Tls13Device("192.168.1.10");
// connect
ConnectResult connectResult = tlsDevice.connect();
//which variables do you want to read?
ReadSymbolicRequest readRequest = new ReadSymbolicRequest();
readRequest.addFullVariableName("Datenbaustein_1.ByteValue");
readRequest.addFullVariableName("Datenbaustein_1.RealValue");
// read from device
var readResult = tlsDevice.readData(readRequest);
// evaluate results
if (readResult.getQuality() == OperationResult.eQuality.GOOD) {
for (PlcCoreVariable variable : readResult.getVariables()) {
System.out.println(variable.getVariableDetails().getFullVariableName() + " Value: " + variable.getValue());
}
} else {
System.out.println("read not successfull! Message: " + readResult.getMessage());
}
Example: simple reading with symbolic access
// Create a device instance
Tls13Device tlsDevice = new Tls13Device("192.168.1.100");
// connect
ConnectResult connectResult = tlsDevice.Connect();
// Create a list of variable to write
List writeVariables = new List();
/*
* IMPORTANT TODO FOR YOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Before you can write, you need the imported variable. Either you have
* determined it by a read operation or you have PLCCom output the empty
* variable (without values)
*/
var variableBody = tlsDevice.GetEmptyVariableBody("DataBlock_1.ByteValue");
// Set the value and add the variable to the write list
variableBody.Value = 1;
writeVariables.Add(variableBody);
variableBody = tlsDevice.GetEmptyVariableBody("DataBlock_1.RealValue");
// Set the value and add the variable to the write list
variableBody.Value = 123.456f;
writeVariables.Add(variableBody);
// create a write request
WriteSymbolicRequest writeRequest = new WriteSymbolicRequest(writeVariables);
// write to device
var writeResult = tlsDevice.WriteData(writeRequest);
// evaluate results
if (writeResult.Quality == OperationResult.eQuality.GOOD)
Console.WriteLine("write successfull!");
else
Console.WriteLine("write not successfull! Message: " + writeResult.Message);
' Create a device instance
Dim tlsDevice As New Tls13Device("192.168.1.100")
' Connect
Dim connectResult As ConnectResult = tlsDevice.Connect()
Dim writeVariables As New List(Of PlcCoreVariable)()
' IMPORTANT TODO FOR YOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' Before you can write, you need the imported variable. Either you have
' determined it by a read operation or you have PLCCom output the empty
' variable (without values)
Dim variableBody = tlsDevice.GetEmptyVariableBody("DataBlock_1.ByteValue")
' Set the value and add the variable to the write list
variableBody.Value = 1
writeVariables.Add(variableBody)
variableBody = tlsDevice.GetEmptyVariableBody("DataBlock_1.RealValue")
variableBody.Value = 123.456F
writeVariables.Add(variableBody)
' create a write request
Dim writeRequest As New WriteSymbolicRequest(writeVariables)
' write to device
Console.WriteLine("begin write...")
Dim writeResult = tlsDevice.WriteData(writeRequest)
' evaluate results
If writeResult.Quality = OperationResult.eQuality.GOOD Then
Console.WriteLine("write successfull!")
Else
Console.WriteLine("write not successfull! Message: " & writeResult.Message)
End If
//create a new device instance
Tls13Device tlsDevice = new Tls13Device("192.168.1.100");
// connect
ConnectResult connectResult = tlsDevice.connect();
// create a list of variables for writing
List writeVariables = new ArrayList();
/*
* Before you can write, you need the imported variable. Either you have
* determined it by a read operation or you have PLCCom output the empty
* variable (without values)
*/
var variableBody = tlsDevice.getEmptyVariableBody("Datenbaustein_1.ByteValue");
// Set the value and add the variable to the write list
variableBody.setValue(1);
writeVariables.add(variableBody);
variableBody = tlsDevice.getEmptyVariableBody("Datenbaustein_1.RealValue");
// Set the value and add the variable to the write list
variableBody.setValue(123.456f);
writeVariables.add(variableBody);
// create a write request
WriteSymbolicRequest writeRequest = new WriteSymbolicRequest(writeVariables);
// write to device
var writeResult = tlsDevice.writeData(writeRequest);
// evaluate results
if (writeResult.getQuality() == OperationResult.eQuality.GOOD)
System.out.println("write successfull!");
else
System.out.println("write not successfull! Message: " + writeResult.getMessage());
Example: simple writing with symbolic access
Further extensive code examples can be found in the download package or here on the example page:
Guaranteed fast support - because your time is valuable
Industrial customers know this: Any downtime means production losses and enormous costs. With PLCcom for S7 , you not only secure a powerful communication interface, but also an all-round carefree package:
- 1 year top-level support: With us, you receive exclusive support for one year. Should unexpected problems arise, our experienced support team will be on hand immediately to reduce downtime to a minimum.
- 1 year maintenance plan: During this period, we guarantee you regular updates, upgrades and continuous improvements. This ensures that your software is always up to date.
The period can be extended on request. There is no automatic extension.
Test app for “PLCcom for S7” available for download (freeware)
The test app for PLCcom for S7 is now available for download. .net and java developers can use it to test absolute or symbolic S7 access to S7 controllers in advance.
The source code of the app is also included in the download package of the library.
Ready to give PLCcom a try?
The best and quickest way to get to know our PLCcom component is to download the free trial version and get to know and try out the functions at your leisure.
You get full access to all functions and can start creating your software in no time at all.
Support Information
EU Compliance (CRA)
Cyber Resilience Act (EU 2024/2847)
Changelog PLCcom for S7
Version 16.5.1
- Bug fix: Fixed an error when reading remanent data in deeply nested structures.
- Bug fix: Improved stability when symbolically reading large sets of variables.
- Bug fix: Corrected behaviour when repeatedly reading symbolic variables that are already known.
- New: Symbolic writing tasks can now also be built up step by step.
- New: Variables can now be added to symbolic expressions at a later stage.
- Improvement: Symbolic writing requirements are now validated more thoroughly.
- Improvement: Invalid, empty or duplicate entries in symbolic write requests are detected at an early stage.
Version 16.4.7
- Bug fix: The rack/slot combination 0/0 for LOGO! controllers is now recognised as a valid connection setting again.
Version 16.4.6
- Bug fix: A problem that could occur when reading entire unoptimised databases as a struct. If the database contained UDTs with Boolean values or Boolean arrays, incorrect length information might sometimes have been applied.
- internal adjustments and improvements
Version 16.4.4 ( .net version only)
- Bug fix: Communication issue when reading optimized string arrays or WString arrays
- Bug fix: In some cases, connection drops were not detected until a few seconds later
- internal adjustments and improvements
Version 16.4.3
- Bug fix: Connection errors that occur during the negotiation of a Put-Get connection are now correctly reported back to the caller. Previously, Connect() might not have returned a clear error result even if PDU negotiation failed.
- Bug fix: Write operations on a put-get connection could return an incorrect response if the connection was interrupted at an inopportune moment during the operation.
Version 16.4.1
- New: Legacy connection sequences initiated cyclically (every hour) by the PLC are now terminated prematurely by an internal connection switch; externally, the connection remains open at all times.
- Bug fix: System structures cannot be read in certain scenarios after optimization has been performed (Result => Variable not in inventory)
- Bug fix: Removed line breaks in the ToString functions of variable instances
- Bug fix: Incorrectly serialized timestamps resulting from changes to subscription variables could potentially lead to incorrect values for the reported items.
- Update: Upgrade der PackageReferences Microsoft.Extensions.Configuration.Json Version 10.0.7 and System.IO.Ports Version 10.0.7
Version 16.3.4
- Bug fix: There was still a possibility that Dtl data types could not be serialized correctly after optimization
- internal adjustments and improvements
Version 16.3.2
- New: You must now always enter a (trial) license key to run the software. Unfortunately, this is a requirement due to legal export restrictions. The free 10-minute trial period has been disabled. You can request a trial key via our download page.
- Bug fix: There was an issue where Dtl data types could not be serialized correctly after optimization was performed
- Bug fix: Adding a large number of Put/Get read requests to a ReadWriteRequestSet could take an unusually long time
Version 16.3.1
- Bugfix: Systemstructs wie Dtl, CRef, etc. und deren Member wurden in einigen Optimierungssituationen falsch mit einer BAD Quality zurückgegeben
- Bugfix: Arrays von Strukturen die nicht 0-basiert waren und indirekt mit GetVariableByFullVariableName abgefragt wurden, wurden falsch als 0-basiert ausgegeben
- Bug fix: Depending on the firmware version of the controller, reading optimized multidimensional Boolean arrays could result in poor quality.
- Extensive internal adjustments and performance improvements
Version 16.2.2 (Java version only)
- Bug fix: Improved stability of notification processing; in rare cases, alarm events could not be delivered.
Version 16.2.1
- Neu (Expert): Neue Optimierung ‚Deep Lookup‘ im ReadSymbolicResultSet – Untervariablen können jetzt direkt per FullVariableName über GetVariableByFullVariableName(…) und TryGetVariableByFullVariableName(…) aus dem Read-Ergebnis abgerufen werden, auch wenn beim Lesen nur ein übergeordneter Knoten (z. B. DB, Struct oder Array) angefordert wurde
- Bug fix: In rare cases, an unhandled exception could occur during very rapid connect/disconnect sequences – this behavior has been fixed.
- Bug fix: Correct JSON output for arrays within structs (consistent and correctly formatted serialization)
- Adjustment: Type mapping for eInternalDataType (CLR types / Java types) is now listed in the library documentation.
- Adjustment: Updating dependencies (.NET and Java) to the current version
Version 16.1.3
- Bug fix: During symbolic optimized reading, it could happen that determined values could not be correctly assigned to the variables.
- Bug fix: Correct transfer of cryptoFormat in the decryptor and null/empty check for the encryption password in the FileSystemConnector (java version only)
- Internal adjustments
Version 16.1.1
- New: Support for S7 controllers with firmware 4.1 (TIA V21)
- New: Libraries validated against controllers with firmware 4.1 (TIA V21)
- New: Support for S7-1200 G2 controllers
- New: Support for .net 10.0 (.net version only)
- New: Support for Java 25 (java version only)
- New: Restriction on execution under Java version 12 has been removed (Java version only)
- New: Reading structures
- New: Reading complete data blocks as a structure
- New: TLS, server certificate verifiable by the customer
- New: TLS, transfer of trusted server certificates possible
- New: Extensive optimization functions for high-performance symbolic reading (Expert Edition)
- New: Transfer of the desired optimization to the ReadSymbolicRequest object (NONE, OBJECT_BASED, CROSS_OBJECT, SMART, SMART only available for TLS connections, Expert Edition)
- New: Storage of desired optimization and execution plans in the ReadSymbolicRequest object (Expert Edition)
- New: Direct access to read variables within a ReadSymbolicResultSet, integrated functions:
- .net function: GetVariableByFullVariableName, TryGetVariableByFullVariableName
- java function: getVariableByFullVariableName, tryGetVariableByFullVariableName
- Bug fix: Fixed an issue with variables or data blocks whose names contain periods.
- Bug fix: Incorrectly assigned data type in S7 type "Array of Byte," sbyte[] replaced with byte[] ersetzt
- Bug fix: Alarm timestamps are now displayed correctly for certain firmware versions.
- New: PLCcom for S7 is CRA (Regulation (EU) 2024/2847, Cyber Resilience Act) certified
- New: Modern encryption format for the PLCcomDataServer AesCbcHmacSha256_V2 (default) including eCryptoFormat for selection between V2 and RijndaelCrypt_Legacy (deprecated).
- Note: Connections via serial port (MPI/PPI) are only available under Windows.
- General: Update of the Java dependency Bouncy Castle from -jdk15to18 to -jdk18on (java version only)
- General: Extensive performance optimizations in the symbolic area
- General: Extensive internal adjustments and stability improvements
Version 15.7.3
- Bugfix: Return values of the Tostring() function of the PLcErrorVariable are now readable.
- Bugfix: Format correction when reading and writing Boolean arrays on 1200 controllers
- internal stability improvements
Version 15.7.2
- Bugfix: Long PLC responses can incorrectly lead to timeout quality
Version 15.7.1
- Bugfix: TODArray was not resolved correctly
- Bugfix: An error occurred in the CRef json converter.
- Bugfix: missing precision in the LReal data type
- Bugfix: Problem converting the value from json with different language settings Real / LReal data type
- Bugfix: Although a variable is marked as non-readable/writable, a write/read attempt was still made.
- Bugfix: Notification of successful connection was triggered too early in LegacySymbolicDevice (Java version only)
- New: Flag in variable details “IsStructMember”
- New: The Compare/IEquatable interface has been implemented within the data types for improved comparability.
- New: Revised handling of IEC_Timer and IEC_LTimer types
- New: In the constructors of the TCP_ISO_Device class, a remote Tsap can now be passed directly instead of the rack/slot combination.
- New: Improved detection of connection termination
- Further internal adjustments and improvements
Version 15.6.5
- SBOM files for the .net and java versions are now available in the respective delivery package.
- Bugfix: Problem with handling bool arrays on 1200 controllers, which could occur with some firmware versions, has been fixed
- Bugfix: Problem with handling multidimensional bool arrays, which could occur with some firmware versions, has been fixed
- Bugfix Timeout when reading wstring arrays and wstring, which could occur on newer 1500 controllers, has been fixed
- Further internal adjustments and improvements
Version 15.6.3
- Program changes on the CPU are now detected during symbolic access. The library reacts to a software change with a disconnect.
- A symbolic connection can now be set up in dual-channel mode to increase performance. The data requests are then split between two parallel connections.
Activation via property: Device.SetDualChannelModeIsActive(true);
Note: This mode is currently classified as experimental, please test it thoroughly with your CPU/firmware combination before using it. - Bugfix: When reading DTL arrays, an error could occur depending on the CPU/firmware version.
Version 15.5.5
- Performance improvement when using the COMBINE_AREAS optimization type under Put/Get
- Further internal adjustments and improvements
Version 15.5.4 (.net version only)
- Troubleshooting when optimizing read areas with Put/Get
Version 15.5.3
- Adaptation, reading multiple longer strings from fail-safe (F-) controllers
Version 15.5.2 (.net version only)
- Revision of the bug fix from version 15.4.7 possible timeouts when reading large amounts of data from S7-300/400 controllers
Version 15.5.1
- Bugfix: Possible occurrence of problems with mixed reading of bits in combination with other data types under Put/Get and the "COMBINE_AREAS" optimisation
- Introduction of the IsSubscribable flag within the variableDetails for symbolic access
- Revision of the handling of structures within symbolic access.
- Further internal adjustments and improvements
Version 15.4.7
- Fix any timeouts that may occur when reading large amounts of data from S7-300/400 controllers
Version 15.4.6
- Bugfix problematic behavior when timeouts occur within the TLS handshake on very busy computers
Version 15.4.4 (Java version only)
- Bugfix possible occurrence of timeouts when writing a large number of variables
Version 15.4.3
- Bugfix Error during reconnect with symbolic access
- Bugfix: Problem establishing a TLS connection under some older Windows 10 versions
- Significant improvement in performance with symbolic access
- Update of direct and transitive dependencies (thirdparty, java version only)
- Extensive further internal adjustments and improvements
Version 15.3.6
- Bugfix for symbolic legacy access if the telegram length exceeded 1024 bytes
- Bugfix: Problems could occur if the integrating application used certain TLS providers.
- Bugfix for transferring login information for Targetframework 4.7.2 and 4.8
- Partial improvement in performance with symbolic access
- Updating the direct and transitive dependencies (thirdparty)
- Further internal adjustments and improvements
Version 15.3.3
- Bugfix for transferring autoconnect timeouts for symbolic access
- Further internal adjustments and improvements
Version 15.3.1
- Adaptation to newer Logo! controls
- Bugfix: Error when writing S7Strings and Date values
- Further internal adjustments and improvements
Version 15.2.8
- Performance improvements for access via Put/Get
- Various internal adjustments, bug fixes and improvements
Version 15.2.2
- Support for controllers configured with TIA20
- Symbolic legacy access for S7-1200 and S7-1500 controllers which have a firmware version lower than 2.9 (S7-1500 ) or 4.5 (S7-1200), or have been programmed with TIA version lower than V17
- Symbolic access via TLS to control units possible by logging in with user+password
- Access to the alarm system with 1200 and 1500 series control units
- Acknowledging alarms with 1200 and 1500 control units
- Significant performance improvements for access via Put/Get
- Various internal adjustments, bug fixes and improvements
- The existing editions have been merged into a single joint edition to simplify matters
Version 14.1.14
- Bugfix: Incorrect reading and writing of DTL values with absolute addressed access
Version 14.1.12 (.net version only)
- Bugfix: incorrectly assembled Nuget package
Version 14.1.11
- Bugfix: Improved connection quality when connecting to the TIA Simulator
- New: Support for symbolic access to ET200SP controllers
Version 14.1.10 (java version only)
- Bugfix: in some cases an error could occur due to an incorrect certificate in the library
Version 14.1.9
- New: Enable password transfer to enable the connection for symbolic access
- Bugfix: Error when reading and writing WString values
- Bugfix: Error when reading and writing Date_and_Time, LDate_and_Time, Time_of_Day and LTime_of_Day variables
Version 14.1.7
- New: Symbolic reading, writing and retrieval of data from S7-1200/1500 controllers
- Support of Logo control units 0BA01 and 0BA02
- Support of the .Net 8.0 framework (.Net version)
- Support / test Jdk/Openjdk from version 11.23 to version 21 (Java version)
(Please note: Java version 12 is not supported due to tls 1.3 issues)
- Release of the following data types for all framework versions (.Net version):
- LTime*
- LDate_And_Time*
- LTime_of_Day*
- DTL*
- Adaptation and test with modified PLC firmware versions
- Various adjustments to identifiers in order to comply with the naming conventions of the respective programming environment. Please refer to the document:
https://www.indi-an.com/help_s7/Important_notes_for_migrating_from_version_12_or_older_english.pdf - Bugfix: Incorrect addressing when writing bits in write mode Cross_Area
- Diverse internal adjustments and improvements
Version 12.1.5
- Support for .Net 7.0 framework (.Net version)
- Support / test Jdk/Openjdk up to version 19 (java version)
- Implementation of new data types:
- Lint
- LWord
- LReal
- S7WString
- LTime*
- LDate_And_Time*
- LTime_of_Day*
- DTL*
- Adaptation and test with modified PLC firmware versions
- Bugfix: When writing S7String values the length specification was not set correctly
- Diverse internal adjustments and improvements
*) Verfügbar in der java Version und innerhalb der .Net Version ab .Net 7
Version 11.2.1 (.net version only)
- Bugfix: Problem when integrating the library into a net5.0 project
- Bugfix: After restarting the PLCcomDataServer, the quality is incorrectly output as undefined
- Sample projects in the delivery package are now also available for the target platform net5.0
- Reference upgrade System.Io.Ports to version 5
- Support of the .Net 5.0 framework
- Nuget package available
- .NET Framework version at least 3.5
- Adaptations for new PLC types and firmware versions
- Bugfix: Error -125 when writing values with the S7STRING data type fixed
- Bugfix: Occurring error "Resource file not found" fixed
- Bugfix: Missing library "winmm.dll" when running under Linux operating systems
- internal optimizations
- Performance optimization at read option 'Auto'
- Support new firmware versions
- Backward compatibility problem fixed
- PLCcomDatServer.AddReadDataRequest (ReadDataRequest value, String ItemKey) function reintroduced
- internal optimizations
- Supports Logo! 0BA0 controls
- Provision as .Net Standard 2.1, .Net3.5 and .Net 4.6.1 Library (.net Library)
- improved adjustments when using openJRE / openJDK system libraries (java library)
- Execution under Android from Api 21 (java library)
- new possibility to parameterize the balance between CPU usage and speed of data provision (new enum ePerformance)
- improved support for new firmware versions of 1200 and 1500 controllers
- internal bug fixes and improvements
- Bugfix: Possible deadlog at request of long data values with optimizemode AUTO
- internal optimizations
- Component is now available for .net-Standard, .net-Core, Xamarin, UWP and Android
- new function ReadWriteData for optimized reading and writing data
- simultaneous reading or writing of data in a function call in different areas
- new optimization methods CROSS_AREA (Mix-Mode) and COMBINE_AREAS
- automatic calculation of the best optimization mode (only in Expert Edition)
- various internal improvements of the algorithms
As part of the cleanup, various methods and functions have been removed.
These functionalities were already marked as deprecated within the previous versions and should therefore no longer be used for a long time.
The following functions have been removed:
| Version | type | removed function | Instead, functionality to use |
|---|---|---|---|
| Alle | enum | ePLCType.Logo_compatibel | ePLCType.Logo0BA7_compatibel oder ePLCType.Logo0BA8_compatibel |
| Alle | enum | eDataType.UNICODECHAR | eDataType.STRING oder eDataType.S7_STRING |
| Alle | enum | eDataType.BCD | eDataType.BCD16 |
| Alle | object | ReadItemRequest | ReadDataRequest |
| Alle | object | ReadItemRequestCollection | ReadWriteRequestSet |
| Alle | object | ReadRequest | ReadDataRequest |
| Alle | object | WriteRequest | WriteDataRequest |
| Alle | object | ReadItemResult | ReadDataResult |
| Alle | object | ReadItemResultCollection | ReadWriteResultSet |
| Alle | object | ReadResult | ReadDataResult |
| Alle | object | WriteResult | WriteDataResult |
| .Net | method | PLCcomDevice.SetPLCTime(DateTime) | PLCcomDevice.SetPLCClockTime (DateTime) |
| Java | method | PLCcomDevice.setPLCTime(Calendar) | PLCcomDevice.setPLCClockTime (Calendar) |
| .Net | function | PLCcomDevice.GetPLCTime() | PLCcomDevice.GetPLCClockTime() |
| Java | function | PLCcomDevice.getPLCTime() | PLCcomDevice.getPLCClockTime() |
| .Net | function | PLCComDataServer.AddReadDataRequest (ReadDataRequest value, String ItemKey) |
PLCComDataServer.AddReadDataRequest (ReadDataRequest value) |
| Java | function | PLCComDataServer.addReadDataRequest (ReadDataRequest value, String ItemKey) |
PLCComDataServer.addReadDataRequest (ReadDataRequest value) |
| .Net | function | PLCcomDevice.GetLocal_MPI() | PLCcomDevice.GetBUS_ADRESS_LOCAL() |
| Java | function | PLCcomDevice.getLocal_MPI() | PLCcomDevice.getBUS_ADRESS_LOCAL() |
| .Net | method | PLCcomDevice.SetLocal_MPI(int) | PLCcomDevice.SetBUS_ADRESS_LOCAL(int) |
| Java | method | PLCcomDevice.setLocal_MPI(int) | PLCcomDevice.setBUS_ADRESS_LOCAL(int) |
| .Net | function | PLCcomDevice.GetPLC_MPI() | PLCcomDevice.GetBUS_ADRESS_PLC() |
| Java | function | PLCcomDevice.getPLC_MPI() | PLCcomDevice.getBUS_ADRESS_PLC() |
| .Net | method | PLCcomDevice.SetPLC_MPI int) | PLCcomDevice.SetBUS_ADRESS_PLC(int) |
| Java | method | PLCcomDevice.setPLC_MPI(int) | PLCcomDevice.setBUS_ADRESS_PLC(int) |
| .Net | function | PLCcomDevice.GetLocal_PPI () | PLCcomDevice.GetBUS_ADRESS_LOCAL() |
| Java | function | PLCcomDevice.getLocal_PPI () | PLCcomDevice.getBUS_ADRESS_LOCAL() |
| .Net | method | PLCcomDevice.SetLocal_PPI(int) | PLCcomDevice.SetBUS_ADRESS_LOCAL(int) |
| Java | method | PLCcomDevice.setLocal_PPI(int) | PLCcomDevice.setBUS_ADRESS_LOCAL(int) |
| .Net | function | PLCcomDevice.GetPLC_PPI() | PLCcomDevice.GetBUS_ADRESS_PLC() |
| Java | function | PLCcomDevice.getPLC_PPI() | PLCcomDevice.getBUS_ADRESS_PLC() |
| .Net | function | ConnectResult.HasConnected | OperationResult.getQuality |
| Java | function | ConnectResult.hasConnected() | OperationResult.getQuality() |
| .Net | function | ConnectResult.HasWorked | OperationResult.getQuality |
| Java | function | ConnectResult.HasWorked () | OperationResult.Quality() |
| .Net | function | BasicInfoResult.Ordernummer | BasicInfoResult.Ordernumber |
| Java | function | BasicInfoResult.Ordernummer() | BasicInfoResult.Ordernumber() |
Within the new version, the following functionalities have been marked as deprecated:
| Version | type | Deprecated | Instead, functionality to use |
|---|---|---|---|
| .Net | function | ReadData(ReadDataRequestCollection) | ReadWriteData(ReadWriteRequestSet) |
| Java | function | readData(ReadDataRequestCollection) | readWriteData(ReadWriteRequestSet) |
| Java | function | DeviceInfo() | getDeviceInfo() |
| Java | function | DisConnect() | disConnect() |
| Java | function | BeginConnect() | beginConnect() |
| Java | function | StartPLC() | startPLC() |
| Java | function | GetPLCClockTime() | getPLCClockTime() |
| Java | function | SetPLCClockTime(Calendar) | setPLCClockTime(Calendar) |
| Java | function | GetLEDInfo() | getLEDInfo() |
| Java | function | GetBasicInfo() | getBasicInfo() |
| Java | function | GetCPUMode() | getCPUMode() |
| Java | function | GetBlockList() | getBlockList() |
| Java | function | GetBlockLenght(eBlockType, int) | getBlockLenght(eBlockType, int) |
| Java | function | ReadPLCBlock_MC7(eBlockType, int) | readPLCBlock_MC7(eBlockType, int) |
| Java | function | WritePLCBlock_MC7(WritePLCBlockRequest) | writePLCBlock_MC7(WritePLCBlockRequest) |
| Java | function | DeleteBlock(eBlockType, int) | deleteBlock(eBlockType, int) |
| Java | function | GetDiagnosticInfo() | getDiagnosticInfo() |
| Java | function | GetSystemStatusList(int, int) | getSystemStatusList(int, int) |
| Java | function | BasicInfoResult.Ordernumber() | BasicInfoResult.getOrdernumber() |
| Java | function | BasicInfoResult.ModuleVersion () | BasicInfoResult.getModuleVersion () |
| Java | function | BasicInfoResult.FirmwareVersion () | BasicInfoResult.getFirmwareVersion() |
| Java | function | BasicInfoResult.Name () | BasicInfoResult.getName() |
| Java | function | CPUModeInfoResult.CPUModeInfo() | CPUModeInfoResult.getCPUModeInfo() |
| Java | function | CPUModeInfoResult.CPUStateInfo() | CPUModeInfoResult.getCPUStateInfo() |
| Java | function | LEDInfoResult.LEDInfo() | LEDInfoResult.getLEDInfo() |
| Java | function | OperationResult.InnerException() | OperationResult.getInnerException() |
| Java | function | OperationResult.Message() | OperationResult.getMessage() |
| Java | function | OperationResult.Quality () | OperationResult.getQuality() |
- only Java Bugfix connection error to a WinAC RTX PLC
- Fix: Possibly error while reading large data
- Assamblies singed with code singing certificate
- Bugfix: Wrong month reading DATE_AND_TIME values
- Bugfix a possible timeout if running the "IsConnected" function from a second parallel thread
- Resolving compatibility issues when communicating with 1500 firmware with older firmware
- Resolving compatibility issues when communicating with 1500 firmware with older firmware
Version 8.1.3 (only for the .net versions)
- unnecessary debug outputs were removed
- improved firmware version support
- optimized communication process
- Bugfix: Eventually 0 values while communication to WinAC RTX plc
- various little bugfixes
- Bugfix writing data
- Bugfix: 0 Reference error / DataImage logging
- improved stability behavior
- faster recognition of TCP - disconnections
- Bugfix: When connecting to ALREADY otherwise affiliated Logo ! 0BA8- controls
- Write flags while setting a datablock
- new supported Data Types: Time of Day, Time, Date, BCD8, BCD16, BCD32, BCD64
- the existing format BCD is replaced by BCD16
- Bugfix: Error handling zero-based strings
(only for the .Net and WinCE versions)
- fixed signature problems
Version 7.2.0
- Bugfix: Writing more than 485 Bytes in a S7 1500er PLC
-
Unification of class model for reading, writing and access to ReadCollection
-
detailed diagnostic output for every single request leading to an efficient error tracking
-
full support of Siemens Logo! 0BA8
-
Data server for event controlled variable monitoring on the SPS (expert version only)
-
Appropriation of logging connectors for: (expert version only)
- Progressive logging of SPS data to file system or SQL database
- Writing of a latest SPS data copy to file system or SQL data base for further usage
- encoded data storage to filesystem
- no limitation of database type while definition and handoff database connection by developer (Within the subfolder / docs you will find a list of all tested SQL data)
-
Performance optimized
-
smaller bugfixes
-
complete work-over of example- and testing-programs
Version 6.14.0
-
Bugfix: Reading S7-Strings, if actual lenght equals max lenght
-
Bugfix: Reading Flags (from Version 6.10.0)
Version 6.10.0
-
internal improvement
-
more bugfix: Blocks more 113 objects
-
Bugfix when DB-number > 9999
Version 6.9.0
-
internal improvement
-
Bugfix: Blocks more/equal 113 objects
-
Bugfix: Timeout problems at MPI connection
-
Bugfix when reading many data blocks (GetBlocklist)
-
Bugfix: Error if optimize of readcollections is deactivated
-
Rename: Function: setoptmize to setoptimize
-
Deprecated setlength
-
Bugfix: Read / write S7Strings longer than 127 Bytes
- Added: Read unsigned Bytes
-
Bugfix >> Error during write of multiple blocks when the PLC has not much free memory available
-
Bugfix >> NullReferenzException occurred while read a ReadItemRequestCollection and the device is not connected
-
Added Datatype S5 Time
-
property Speed in the base class PLCcomDevice implemented (only .Net-, and WinCE-versions)
-
getSpeed und SetSpeed in the base class PLCcomDevice implemented (only Java version)
-
Bugfix >> Error occurred while adding an item when optimization is enabled
-
Version release for Windows CE 5.0 and 6.0 (e.g. ARM-Processors)
- Support Siemens LOGO!-PLC (version 0BA7)
- Start / stop S7-1200 PLCs
- Get created Blocks
- Read block lenght
- Backup existing blocks
- Restore existing blocks
- Restore to diffent blocks
- Read block details e.g. creating language (AWL, KOP, etc.), author, version, rawdata, header, footer uvm.
- Read diagnostic buffer and return flat text messages
- Delete blocks
- send password to unlock connection of password-protected PLCs
- Support PLCSIM (from version 5.4 > requires installed Netgateway e.g. NetToPlcSim)
- Implementation abstract basis class to inherit of the device classes (TCP_ISO_DEVICE, MPI_DEVICE, PPI_DEVICE)
- Implementation of methods to direct writing of Strings and S7Strings with codepage or cultureInfo
- Reading basic informations while connecting device. Provide informations as BasicInfoResult from Property DeviceInfo
- Implementation of "Service-Connections" to control Logo!-PLCs
- Setting PLC communication port number of TCP-IP-Connections
- Setting local communication port number of TCP-IP-Connections(Important for firewall settings)
- Providing connection informations as ConnectionState
- Event implementation "On_ConnectionStateChange" while ConnectionState changes
- Implementation of asyncron connecting
- AutoConnect with adjustable waiting time till auto disconnect
- Mulit languages implementation (currently english (default) and german
- Read data from system state list (if existing)
- Reading PLC operating mode and status (run, stop, key position, etc.)
- Renewal the example application
- Increase in performance
- Bugfix (timeout while changing the clocks (summer/winter))
- Bugfix ReadItemResultCollection block greater than 2206
- Deprecated Methods read/write UniCode. New methods read/write Strings and S7Strings
- Implementation a quality enum type within result classes, to indicate kind of success (without parsing error texts as before)
- Rename return value of class BasicInfoResult from Ordernummer to OrderNumber
- Removal propertys Local_MPI, Local_PPI, PLC_MPI, PLC_PPI with propertys BUS_ADRESS_LOCAL and BUS_ADRESS_PLC in device classes. Local_MPI, Local_PPI, PLC_MPI, PLC_PPI marked as "deprecated"
- Removal functions GetPLCTime and SetPLCTime with functions GetPLCClockTime and SetPLCClockTime, and return a PLCClockTimeResult-object. GetPLCTime and SetPLCTime marked as "deprecated"
- internal Fixes...
-
compatible with Siemens Soft PLC WinAC RTX 2010
- compatible with Siemens PLC of the 1500s series
- supports the .Net Framework 4.5
- Bugfix GetPLCTime
- Performance optimizations for access with TCP-IP
- Bugfix when addressing Rack + Slot
-
Bugfix GetPLCTime
- Bugfix result output when writing
-
With the new upgrade, the PLCcomS7 Library achieves a significant performance increase for cyclically recurring read accesses.
A major innovation is the introduction of new "ReadItemCollection Objects", to which the variables to be read individually (e.g. individual DINT values) are added.
When reading, these variables are combined to optimum read accesses to the corresponding PLC. Thus, the necessary read accesses to the respective PLC are reduced to a minimum, which means a much improved performance, as opposed to individually requested variables.
Something else that is also omitted is the summary of variables into a stream by the software developer - this means that the development time is reduced significantly and this aspect also greatly simplifies the handling.
Internal process changes also ensure improved performance and stability.
-
Bugfix write Int
-
any potential problems with VIPA-CPUs fixed
-
Support of S7 1200er model series
-
.Net Framework 4 compatible
-
Bugfix read Byte
-
Bugfix write Dword
-
Bugfix for “ADDWORD”
-
Bugfix at event. „Write errors of Bits"
-
Bugfix: SetPlcTime
-
Starting and stopping the CPU
- Reading out serial number and firmware version
- Reading out Keyswitch setting
- Reading out LED info
- Reading and writing Date_and_Time values
-
Supports communication via PPI Protocol
-
Supports communication for SPS S7-200 via CP-243 (TCP/IP)
- capable of running and tested under Linux with Mono Framework 2.4
- various performance improvements
Documentation PLCcom for S7
Appendix A – PUT/GET Guide .NET
Appendix B – Symbolic Guide .NET
Appendix C – .NET Security Guide
Appendix D – LOGO! Guide .NET
Appendix E – External Logging Guide for .NET
Appendix F – .NET Migration Guide
Appendix A – PUT/GET Guide for Java
Appendix B – Java Symbolic Guide
Appendix C – Java Security Guide
Appendix D – LOGO! Guide Java
Appendix E – External Logging Guide for Java
Appendix F – Java Migration Guide
Cyber Resilience Act (CRA) – EU compliance documents (EU 2024/2847)
PLCcom for S7 .NET
PLCcom for S7 Java


