CODESYS Benchmark¶
The CODESYS benchmark is an example application that allows deterministic control and test of the CODESYS SoftPLC. The application is defined such that a main task occurs every 250us. Within the main task is a configurable workload which iterates a number of user defined times. The specific workload is configurable to either: “floating point”, “arithmetic”, or “boolean” operations. Cycle execution times are measured from which minimum, maximum, and jitter measurements are derived. These measurements allow performance characterization of the CODESYS SoftPLC on the target system.
Prerequisites
A Windows system (x64 bit) to host the CODESYS IDE
A target system with the CODESYS Linux Runtime installed (See Install CODESYS Linux Runtime)
Ability to modify IP address of both the Windows PC and target system
Ability to connect both the Windows PC and target system via Ethernet network
The following steps are applicable to:

This CODESYS example project was created and validated using CODESYS V3.5 SP17 Patch 2 + (64-bit). Project compatibility differences may occur when changing CODESYS version.
See also
This section assumes you are already familiar with CODESYS and how to deploy a workload to the CODESYS Linux runtime. For a detailed tutorial, see section: Application #2: CODESYS OPC UA Publish/Subscribe
Use the Intel edgesoftware utility to download the ECI release archive, if not done already.
Copy the
CODESYS_Example_Applications.zip
archive from the ECI release archive (release-eci_#.#.zip
) to the Windows system. This archive is located in the ECI release archive within theEdge-Controls-for-Industrial
directory as follows:└── Edge-Controls-for-Industrial ├── Codesys_Example_Applications.zip ├── Dockerfiles.tar.gz └── eci-release.tar.gz
Extract the
CODESYS_Example_Applications.zip
archive. Navigate to the Benchmark directory. Double-click Benchmark_Linux_3.5.x.x.project to open the project with CODESYS.The benchmark application was created assuming the CODESYS Linux runtime has an IP address of
10.11.12.50
on interfaceeno1
. However, you can change these if required. You need to change two IP addresses to accomplish this:IP Address #1:
IP address in the CODESYS application (change via the CODESYS IDE) - Double-click “Ethernet” from the Devices pane. The IP address settings are displayed on the left pane.
IP Address #2:
IP address of the Windows PC running CODESYS IDE. Windows is configured with
10.11.12.55
to be on the same subnet as the CODESYS Linux runtime.The following steps are applicable to:
On the target system, install the
codesys-benchmark-scripts
Deb package from the ECI APT repository. Setup the ECI APT repository, then perform the following command to install this component:$ sudo apt install codesys-benchmark-scripts
Modify the IP address of target system to match the CODESYS project. Run the following commands on the target system to change the IP address of the device interface to
10.11.12.50/24
. Replace<interface_name>
with the name of your interface (Example:eno1
):$ ip a flush dev <interface_name> $ ip a add 10.11.12.50/24 dev <interface_name>
Navigate to
/opt/benchmarking/codesys/utility
. This directory contains a number of useful scripts for improving the real-time performance of the CODESYS Linux runtime.The scripts available at
/opt/benchmarking/codesys/utility
include:start_codesys_native.sh
: Optimizes the system (see list below), stops non-essential services, and restarts the CODESYS runtimestart_codesys_container.sh
: Optimizes the system (see list below) and starts the containerized CODESYS Linux runtime with RT priority.taskset_codesys.sh
: Optimizes the system (see list below)
Note
The
start_codesys_container.sh
script assumes you have completed the CODESYS Containerization section of this guide: Microservice: CODESYS Linux Runtime and CODESYS Edge GatewayThe scripts also perform the following runtime optimizations:
Uses CAT to allocate exclusive access of half the last-level cache to cores 1,3
Assigns benchmark thread affinity to cores 1,3
Assigns non-benchmark thread affinity to core 0
Changes the priority of benchmark thread to 90 (using:
chrt -f 90
)Disables kernel machine check interrupt
Increases the thread runtime utilization to infinity
When executing the scripts, not all task affinity can be changed. This is expected behavior. An example output is shown below:
$ sudo /opt/benchmarking/codesys/utility/start_codesys_native.sh Stopping unecessary services Failed to stop ofono.service: Unit ofono.service not loaded. Failed to stop wpa_supplicant.service: Unit wpa_supplicant.service not loaded. Failed to stop bluetooth.service: Unit bluetooth.service not loaded. Stopping Docker Daemon Warning: Stopping docker.service, but it can still be activated by: docker.socket Stopping Codesys Runtime Disabling Machine Check Disabling RT runtime limit New COS default: 0xff0 Changing CPU affinity of existing interrupts setting 1 to affine for core 0 setting 4 to affine for core 0 setting 8 to affine for core 0 setting 9 to affine for core 0 setting 12 to affine for core 0 setting 14 to affine for core 0 setting 16 to affine for core 0 setting 18 to affine for core 0 setting 27 to affine for core 0 setting 29 to affine for core 0 setting 120 to affine for core 0 setting 121 to affine for core 0 setting 123 to affine for core 0 setting 124 to affine for core 0 setting 125 to affine for core 0 setting 126 to affine for core 0 taskset: failed to set pid 3's affinity: Invalid argument taskset: failed to set pid 4's affinity: Invalid argument taskset: failed to set pid 16's affinity: Invalid argument taskset: failed to set pid 23's affinity: Invalid argument Starting Codesys Runtime Changing affinity of Codesys Runtime tasks Codesys preparation complete.
Run the
start_codesys_native.sh
script available at/opt/benchmarking/codesys/utility
to reload the CODESYS Linux runtime in preparation of the benchmark:$ cd /opt/benchmarking/codesys/utility $ ./start_codesys_native.sh
Build, download, and run the CODESYS Benchmark as outlined in OPC UA Publish/Subscribe Example. The CODESYS Benchmark is configured to host a web visualization at
http://10.11.12.50:8080
. If the benchmark is working correctly, the web visualization should be similar to following image:Run the
taskset_codesys.sh
script at/opt/benchmarking/codesys/utility
to move all CODESYS tasks to CPU cores 1,3 and change the priority of all CODESYS tasks to RT:$ ./taskset_codesys.sh
Use the RESET buttons in the web visualization to reset the statistics after running the
taskset_codesys.sh
script. This CODESYS benchmark demonstrates that real-time performance can be achieved with proper kernel and runtime configurations.Use the slider and arrow buttons to increase or decrease the number of workload iterations per cycle.
The colored LEDs are connected to variables mapped to an OPC UA server. Connect an OPC UA client to the CODESYS OPC UA server to read/write the values. You can download a popular free OPC UA client called UaExpert from: https://www.unified-automation.com/products/development-tools/uaexpert.html.