From 071f782901c080d253f534d9b90e6c10046c895b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 24 Nov 2025 13:28:03 +0100 Subject: [PATCH 1/4] Update OPAL-RT logo with SVG version Signed-off-by: Steffen Vogel --- docs/index.md | 2 +- docs/node/clients/opal_async_ip.md | 2 +- docs/node/nodes/opal/index.md | 2 +- static/img/logos/opal-rt.svg | 152 +++++++++++++++++++++++++++++ static/img/logos/opal.jpg | Bin 34280 -> 0 bytes 5 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 static/img/logos/opal-rt.svg delete mode 100644 static/img/logos/opal.jpg diff --git a/docs/index.md b/docs/index.md index b85d0ba1..c575bcc2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -101,7 +101,7 @@ Most contributions are made by the following authors: [OPAL-RT Germany GmbH](https://www.opal-rt.com/) -OPAL-RT Germany Logo +OPAL-RT logo ## Contact & Community diff --git a/docs/node/clients/opal_async_ip.md b/docs/node/clients/opal_async_ip.md index f0db6785..61645f18 100644 --- a/docs/node/clients/opal_async_ip.md +++ b/docs/node/clients/opal_async_ip.md @@ -3,7 +3,7 @@ sidebar_label: OPAL-RT RT-LAB title: OPAL-RT RT-LAB Asynchronous Process (AsyncIP) --- -# OPAL-RT RT-LAB Asynchronous Process (AsyncIP) OPAL-RT logo +# OPAL-RT RT-LAB Asynchronous Process (AsyncIP) OPAL-RT logo ## OPAL-RT RT-LAB Example Project diff --git a/docs/node/nodes/opal/index.md b/docs/node/nodes/opal/index.md index 15832052..439333c4 100644 --- a/docs/node/nodes/opal/index.md +++ b/docs/node/nodes/opal/index.md @@ -2,7 +2,7 @@ hide_table_of_contents: true --- -# OPAL-RT Integration +# OPAL-RT Integration OPAL-RT logo There are three options to exchange simulation signals with an OPAL-RT real-time simulator: diff --git a/static/img/logos/opal-rt.svg b/static/img/logos/opal-rt.svg new file mode 100644 index 00000000..9b6795cb --- /dev/null +++ b/static/img/logos/opal-rt.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logos/opal.jpg b/static/img/logos/opal.jpg deleted file mode 100644 index ec5687adfc7bfef62f88d02b546a6b4c2b9eaa4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34280 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 R!;clH7_jGXJoCr={{V{Jzrz3k From 22377dd7d04cf85ea5e0c29b9c7a9acb12333ca9 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 30 Nov 2025 17:04:08 +0100 Subject: [PATCH 2/4] Rework documentation of OPAL-RT node-types Signed-off-by: Steffen Vogel --- docs/node/guides/lab21.md | 128 +++++++++++++++++++++++++ docs/node/nodes/opal/index.md | 29 ++++-- docs/node/nodes/opal/opal_async.md | 36 +++---- docs/node/nodes/opal/opal_orchestra.md | 48 ++++++++-- 4 files changed, 209 insertions(+), 32 deletions(-) create mode 100644 docs/node/guides/lab21.md diff --git a/docs/node/guides/lab21.md b/docs/node/guides/lab21.md new file mode 100644 index 00000000..ba577279 --- /dev/null +++ b/docs/node/guides/lab21.md @@ -0,0 +1,128 @@ +--- +sidebar_position: 21 +--- + +# Lab 21: Run on OPAL-RT real-time targets + +## Introduction + +This guide aims to provide step-by-step instructions for using VILLASnode with OPAL-RT's real-time simulation targets. +For didactic reasons, the example employed in this guide is build from scratch. + +However, a completed RT-LAB example model is provided as well in the VILLASnode Git-repository: **TODO**. + +### Orchestra + +OPAL-RT's Orchestra is a co-simulation environment allowing the integration and interoperability between heterogeneous models, written in different programming languages or generated by various tools. It is acting as a communication layer between OPAL-RT's HYPERSIM and RT-LAB software platforms and the external components. + +OPAL-RT's Orchestra consists of two main components: + +- **Framework:** An Orchestra _Framework_ provides publish-subscribe like broker functionality and is started as part of the real-time simulation model by HYPERSIM or RT-LAB. Each framework hosts a single Orchestra _Domain_. A _Domain_ describes the set of signals which are exchanged between the models and one-or-more connected _Clients_. +- **Client:** An external / third-party component connecting to a Orchestra framework domain. Clients connect to the framework locally via a shared-memory segment or remotely via Ethernet (UDP or TCP), or Dolphin / Reflective memory fabrics. + +In this guide, VILLASnode takes the role of a _Client_. +By doing so, we can utilize the large set of available [VILLASnode node-types](../nodes) to exchange signals with a real-time model. + +To limit the complexity of the setup, we run the VILLASnode gateway on the real-time simulation target itself. +This is made possible by the OPAL-RT Linux Operation System which allows us to run standard Linux applications directly on the real-time target. + +It should be noted that thanks to the flexibility of Orchestra communication layer, VILLASnode could also be executed on a different Linux system and communicate with the _Framework_ over Ethernet (UDP / TCP). +However, we do not recommend this approach as it increases communication overhead and adds additional latency and computation overhead. + +## Requirements + +This guide has been tested with the following software versions: + +- **VILLASnode:** v1.0.1 +- **RT-LAB:** v2025.1.3.77 +- **OPAL-RT Linux:** v3.5.4 +- **Python:** v3.9 +- **Real-time Target:** OP5033XG, OP5707XG or similar + +## Step-by-Step Guide + +### 1. Create a new RT-LAB Project + +1. **Enable Advanced User features:** RT-LAB Menubar -> Window -> Preferences -> RT-LAB -> Capabilities -> Check "Advanced User" +2. **Create RT-LAB project:** RT-LAB Menubar -> File -> New -> RT-LAB Project + - **Project name:** `Orchestra_VILLASnode_Loopback_simple` + - **Use default location:** checked + - **Template:** empty +3. **Enable PyDev features in project:** RT-LAB Project Explorer -> Right-click on new Project -> PyDev -> Set as PyDev Project +4. **Add project-wide Python scripts:** + 1. **Create a new PyDev source directory:** RT-LAB Menubar -> New -> Other -> PyDev -> Source Folder + - **Project:** `Orchestra_VILLASnode_Loopback_simple` (your new RT-LAB project) + - **Name:** `scripts` + 2. **Add package:** RT-LAB Menubar -> New -> Other -> PyDev -> PyDev Package + - **Source Folder:** `Orchestra_VILLASnode_Loopback_simple/scripts` + - **Name:** `orchestra` + 3. **Copy contents new module (opened text editor):** + - **Source:** TODO + 4. **Create new PyDev "Launch Configuration":** RT-LAB Menubar -> Tools -> Python -> Run Configurations... + 1. Select "Python Run" -> Click on "New" icon in upper-left corner of the dialog + - **Name:** `Generate Orchestra DDF` + - **Main Tab** + - **Project:** `Orchestra_VILLASnode_Loopback_simple` (your new RT-LAB project) + - **Main Module:** `${workspace_loc:VILLASnode_Orchestra_Loopback/scripts/orchestra/__init__.py}` + - **Arguments Tab** + - **Arguments**: `${workspace_loc:VILLASnode_Orchestra_Loopback/models/model/orchestra.conf}` (and possible more VILLASnode configuration files, if used) + +### 2. Create a new RT-LAB Model + +1. **Create RT-LAB model:** RT-LAB Menubar -> File -> New -> RT-LAB Model -> Finish + - **Model name:** model + - **Model type:** MATLAB/Simulink (.slx) +2. **Add RT-LAB user script:** RT-LAB Menubar -> New -> Other -> General -> File + - **Parent folder:** `VILLASnode_Orchestra_Loopback/models/model` + - **File name:** `target_preload.py` + - **Contents:** Copy from TODO + +### 3. Installation of VILLASnode + +The installation of VILLASnode on the real-time target is fully automated by the `target_preload.py` [user script](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/143985689/Executing+Models#User-script-files) created in the previous step. +VILLASnode will be automatically installed during model load. + +To verify that the installation succeeded, you can login to the target via SSH and run the `villas node -V` command: + +```shell +$ ssh root@ + +root@rtserver:~# villas node -V +13:12:35 info node This is VILLASnode 1.0.1 (built on Jan 1 1980, 00:00:00) +13:12:35 info signals Initialize subsystem +1.0.1 +``` + +Alternative installation methods as documented on the [Installation page](../installation.md) are supported as well. + +### 4. Create a VILLASnode Configuration File: `orchestra.conf` + +Next, we create a [VILLASnode configuration file](../config/) named an place it into the RT-LAB model directory: + +```text url="external/node/clients/rtlab-orchestra/models/model/orchestra.conf" title="/models/model/orchestra.conf" + +``` + +This configuration file defines how signals exchanged between VILLASnode and the simulation model over Orchestra are further processed in the VILLASnode gateway. +In the example above, we simply perform a loopback over the VILLASnode [`socket`](../nodes/socket.md) node-type to localhost. +This configuration file also include a defintition of all signals including their name and data-type which are exchanged with the simulation model. + +### 4. Generate an Orchestra Data Definition File: `orchestra.xml` + +Based in the VILLASnode config file prepared in the previous step, we now generate an Orchestra data-definition file (DDF): `orchestra.xml`. +This file is used by the Orchestra Framework to specify which _Domains_ exist and which signals they contain. +This step is automated using a Python script which we first add to our RT-LAB project: + + +:::caution +The VILLASnode config file (`orchestra.conf`) and the Orchestra data-definition file (`orchestra.xml`) must kept synchronized. +Please repeat this step, whenever you change the VILLASnode config file. +::: + +### 6. Build the RT-LAB Model on the Target + +### 7. Add an Orchestra Framework I/O Interface + +### 8. Create Connections between I/O Interface and Model + +### 9. Run Model \ No newline at end of file diff --git a/docs/node/nodes/opal/index.md b/docs/node/nodes/opal/index.md index 439333c4..ca69a536 100644 --- a/docs/node/nodes/opal/index.md +++ b/docs/node/nodes/opal/index.md @@ -6,15 +6,30 @@ hide_table_of_contents: true There are three options to exchange simulation signals with an OPAL-RT real-time simulator: -1. **[UDP Sockets](../socket.md):** Use OPAL-RT's UDP/TCP I/O interfaces or an adapted version of the AsyncIP example for asynchronous processes. +1. **[Orchestra](opal_orchestra.md):** VILLASnode can act as an [Orchestra client](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/505348099/Orchestra+I+O). + Orchestra is OPAL-RT's co-simulation framework for integrating custom code and external models. + + The functionality is implemented by the [`opal.orchestra`](opal_orchestra.md) node-type. + + :::tip + This node-type is recommended for new setups. + ::: + +2. **[UDP Sockets](../socket.md):** Use OPAL-RT's [UDP/TCP I/O interfaces](https://opal-rt.atlassian.net/wiki/spaces/PCPM/pages/143720599/TCP+UDP). In this mode, OPAL-RT targets will send signals via a UDP socket to VILLASnode. - VILLASnode use the [`socket` node-type](../socket.md) node-type to send and receive these UDP packets. More information about our adapted AsyncIP example can be found here: [AsyncIP client](../../clients/opal_async_ip.md). -2. **[Orchestra](opal_orchestra.md):** VILLASnode can act as an Orchestra client. - Orchstra is OPAL-RT's co-simulation framework for integrating custom code and external models. - The functionality is implemented in the closed-source [`opal.orchestra`](opal_orchestra.md) node-type. + This functionality is implemented by the [`socket`](../socket.md) node-type. + + :::caution + This node-type is not recommended due to limited synchronizations, and limitations in I/O signal management. + ::: -3. **[Asynchronous Process](opal_async.md):** VILLASnode can act as an RT-LAB Asynchronous Process. +3. **[Asynchronous Process](opal_async.md):** VILLASnode can act as an [RT-LAB Asynchronous Process](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/144020065/Asynchronous+Processes). Data exchange is then handled using OPAL-RT's `libOpalAsyncApi`. - The functionality is implemented in the closed-source [`opal.async`](opal_async.md) node-type. + + The functionality is implemented by the [`opal.async`](opal_async.md) node-type. + + :::danger Deprecation + This node-type is deprecated and not recommended for new setups. + ::: \ No newline at end of file diff --git a/docs/node/nodes/opal/opal_async.md b/docs/node/nodes/opal/opal_async.md index 04710a99..d8b0e69c 100644 --- a/docs/node/nodes/opal/opal_async.md +++ b/docs/node/nodes/opal/opal_async.md @@ -1,8 +1,9 @@ --- hide_table_of_contents: true +sidebar_position: 99 --- -# OPAL-RT Asynchronous Process +# Asynchronous Process > In keeping with the design principle of openness, RT-LAB features can be extended through the use of Asynchronous User Applications also called Asynchronous Processes. This gives RT-LAB users access to the full power of the operating system and allow them to implement their own interfaces to various external devices. Although usually targeted for use with communication devices such as GPS receivers and power monitors, Asynchronous User Applications can be developed to interface acquisition boards, or implement system-specific software such as file management, etc. @@ -10,27 +11,30 @@ hide_table_of_contents: true They are used to exchange data between RT-LAB Simulink models and custom user-defined programs via [shared memory](https://en.wikipedia.org/wiki/Shared_memory) on a real-time target. -## Prerequisites +:::danger[Deprecation] +The `opal.async` node-type is deprecated for the following reasons. -This node-types requires a running version of VILLASnode on an OPAL-RT target: +**Please consider the more actively supported [`opal.orchestra`](./orchestra) node-type instead!** -- An OPAL-RT target running OPAL-RT Linux v3.4.1 or newer -- RT-LAB v2023.1 or newer +- The OPAL-RT **HYPERSIM** simulation environment is not supported. +- Older targets running RHEL / CentOS operating systems are not supported. +- Due to the shared-memory communication remote execution of VILLASnode is not supported. +- Communication between VILLASnode and the RT-LAB model is asynchronous. Its not possible to block the execution of the RT-LAB model until new data is available. +- Asynchronous processes are integrated via legacy S-function IO blocks into the RT-LAB model. Modern RT-LAB & HYPERSIM use a new system for I/O configuration and connections management. +::: -:::caution -The node-types requires the use of the RT-LAB simulation environment. -When using HYPERSIM, please consider the running VILLASnode as an [OPAL-RT Orchestra Client](opal_orchestra.md). +## Prerequisites -Older targets running RHEL / CentOS operating systems are not supported. -::: +This node-types requires a running version of VILLASnode on an OPAL-RT target: -## Implementation +- An OPAL-RT real-time simulator. +- 64-bit OPAL-RT Linux v3.4.1 or newer. +- RT-LAB v2023.1 or newer. -:::note -The implementation of the `opal.async` node-type is currently not open source. +## Implementation -Please contact [Steffen Vogel](mailto:steffen.vogel@opal-rt.com) if you are interested in run -::: +The source code of the node-type is available here: +https://github.com/VILLASframework/node/blob/master/lib/nodes/opal_async.cpp ## Installation @@ -76,7 +80,7 @@ During model load the configuration file will be loaded to the target and used b import ApiSchema from '@theme/ApiSchema'; -{/* */} +{/* */} ## Example diff --git a/docs/node/nodes/opal/opal_orchestra.md b/docs/node/nodes/opal/opal_orchestra.md index d4c4895f..d2ae07bb 100644 --- a/docs/node/nodes/opal/opal_orchestra.md +++ b/docs/node/nodes/opal/opal_orchestra.md @@ -1,26 +1,42 @@ --- hide_table_of_contents: true +sidebar_position: 1 --- -# OPAL-RT Orchestra +# Orchestra -Orchstra is OPAL-RT's co-simulation framework for integrating custom code and external models. -More information about Orchestra can be found in the [OPAL-RT Wiki](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/143626248/Orchestra). +Orchestra is OPAL-RT's co-simulation framework for integrating custom code and external models. +More information about Orchestra can be found in the [OPAL-RT Wiki](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/505348099/Orchestra+I+O). -## Prerequisites +:::tip +Please familiarize yourself first with Orchestra using the [OPAL-RT Wiki](https://opal-rt.atlassian.net/wiki/spaces/PRD/pages/505348099/Orchestra+I+O) before attempting to use it with VILLASnode. +::: -- `libOpalOrchestra.so` & `RTAPI.h` +## Prerequisites -## Implementation +- A OPAL-RT real-time simulator. +- 64-bit OPAL-RT Linux v3.4.1 or newer. + - `libOpalOrchestra.so` & `RTAPI.h` +- One of: + - RT-LAB v2025.1 or newer + - HYPERSIM v2025.3 or newer -:::note -The implementation of the `opal.orchestra` node-type is currently not open source. +:::info +The RT-LAB and HYPERSIM versions above were validated. Other versions might work as well. Use at your own discretion. +::: -Please contact [Steffen Vogel](mailto:steffen.vogel@opal-rt.com) if you are interested in run +:::caution +Older 32-bit OPAL-RT targets running RHEL / CentOS operating systems are not supported. ::: +## Implementation + +The source code of the node-type is available here: +https://github.com/VILLASframework/node/blob/master/lib/nodes/opal_orchestra.cpp + ## Installation +Please refer to the [Lab 21](../../guides/lab21) for a detailed guide on how to install VILLASnode on an OPAL-RT Real-time target. ## Configuration {#config} @@ -137,3 +153,17 @@ paths = ( } ) ``` + +## Running VILLASnode on a remote system + +Orchestra offers the possibility to run VILLASnode (as an Orchestra client) on a separate machine from the real-time target. +This allows for integration and Co-simulation external systems. +In this case signals between the client and the framework are exchanged over a TCP or UDP/IP connection. + +:::caution +This is an advanced use-case as it requires linking of VILLASnode against `libOpalOrchestra.so` on a non-OPAL-RTLinux system. + +When [building VILLASnode with Nix](../../installation.md#nix), or using any of the by-Nix pre-compiled installations options like the [standalone](../../installation.md#standalone) or `.rpm` packages or [Docker images](../../installation.md#docker), +VILLASnode, should be already compiled with the necessary `libOpalOrchestra.so` library and `OrchestraExtCommIP` helper tool. +::: + From 0a5253445fc1cf19738778065a3cae15b291fd50 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 30 Nov 2025 17:05:03 +0100 Subject: [PATCH 3/4] Minor tweaks to the VILLASnode installation guide Signed-off-by: Steffen Vogel --- docs/node/installation.md | 120 +++++++++++++++++++---------- docs/node/nodes/opal/opal_async.md | 2 +- 2 files changed, 80 insertions(+), 42 deletions(-) diff --git a/docs/node/installation.md b/docs/node/installation.md index 6dad8a7f..8b890178 100644 --- a/docs/node/installation.md +++ b/docs/node/installation.md @@ -6,7 +6,8 @@ sidebar_position: 3 VILLASnode can be installed in multiple ways: -- [Precompiled standalone binaries](#standalone) +- [Pre-compiled standalone binaries](#standalone) +- [Pre-compiled RPM package](#rpm) - [Docker image](https://git.rwth-aachen.de/acs/public/villas/node/container_registry) - [Kubernetes (Helm chart)](../installation.md) - [Nix Flake](#nix) @@ -18,45 +19,68 @@ Please make sure that your system fulfills the [requirements](requirements.md) b ## From sources {#source} -VILLASnode can be compiled from source using [CMake](http://cmake.org). +VILLASnode can be compiled from source using [CMake](http://cmake.org): + +#### TL;DR Version + +```shell +mkdir -p ~/build/villas +cd ~/build/villas + +git clone https://github.com/VILLASframework/node.git + +mkdir -p node/{prefix,build} +cd node + +export PREFIX=/opt/villas +export CMAKE_PREFIX_PATH=${PREFIX} +export CMAKE_INSTALL_PREFIX=${PREFIX} +mkdir -p ${PREFIX} + +DEPS_NONINTERACTIVE=1 \ +bash packaging/deps.sh + +cmake -B build -S . +cmake --build build --parallel 4 --target install +``` ### Prerequisites VILLASnode currently has the following list of dependencies: -| Package | Version | Purpose | Optional | License | -| --- | --- | --- | --- | --- | -| [CMake](http://cmake.org/) | >= 3.9 | for generating the build-system | required | BSD 3 | -| [fmtlib](https://github.com/fmtlib/fmt) | >= 6.1.2 | for string formatting | required | MIT | -| [libcurl](https://curl.haxx.se/libcurl/) | >= 7.29.0 | for HTTP REST requests by the [NGSI node-type](nodes/ngsi.md) node-type | required | similar to MIT | -| [libjansson](http://www.digip.org/jansson/) | >= 2.7 | JSON parser for [Websocket node-type](nodes/websocket.md) and [NGSI node-type](nodes/ngsi.md) node-types | required | MIT | -| [libuuid](https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git) | >= 2.29 | - | required | BSD | -| [libwebsockets](http://libwebsockets.org) | >= 3.1.0 | for the [Websocket node-type](nodes/websocket.md) | required | MIT | -| [openssl](https://www.openssl.org) | >= 1.0.0 | for cryptographic hashing functions | required | Apache 2 for >=3.0 | -| [spdlog](https://github.com/gabime/spdlog) | >= 1.8.2 | for logging | required | MIT | -| [comedilib](http://comedi.org) | >= 0.11.0 | for the [Comedi node-type](nodes/comedi.md) | optional | LGPL-2.1 | -| [Criterion](https://github.com/Snaipe/Criterion) | >= 2.3.1 | for running the unit tests | optional | MIT | -| [Etherlab](http://etherlab.org) | >= 1.5.2 | for the [Ethercat node-type](nodes/ethercat.md) | optional | __GPL 3__ | -| [Graphviz](https://graphviz.org/) | >= 2.30 | for the visualisation of configuration files | optional | EPL | -| [libconfig](http://www.hyperrealm.com/libconfig/) | >= 1.4.9 | for parsing the configuration file | optional | LGPL-2.1 | -| [libdatachannel](https://libdatachannel.org/) | >= 0.18.4 | for the WebRTC node-type | optional | MPL-2.0 | -| [libibverbs](https://github.com/linux-rdma/rdma-core) | >= 16.2 | for the [Infiniband node-type](nodes/infiniband.md) | optional | BSD | -| [libiec61850](http://libiec61850.com/libiec61850/) | >= 1.3.1 | for the [IEC61850-8-1](nodes/iec61850-8-1.md) and [IEC61850-9-2](nodes/iec61850-9-2.md) node-types | optional | __GPL 3__ | -| [libmodbus](https://libmodbus.org/) | >= 3.1.0 | for the [Modbus](nodes/modbus.md) node-type | optional | LGPL-2.1 | -| [libnanomsg](http://nanomsg.org/) | >= 1.0.0 | for the [Nanomsg node-type](nodes/nanomsg.md) | optional | MIT | -| [libnice](https://libnice.freedesktop.org/) | >= 0.1.16 | for libdatachannel / WebRTC | optional | MPL-1.1 & LGPL-2.1 | -| [libnl3](http://www.infradead.org/~tgr/libnl/) | >= 3.2.27 | for the network communication & emulation support of the [Socket node-type](nodes/socket.md) node-type | optional | LGPL-2.1 | -| [librdmacm](https://github.com/linux-rdma/rdma-core) | >= 16.2 | for the [Infiniband node-type](nodes/infiniband.md) | optional | BSD | -| [libre](http://www.creytiv.com/re.html) | >= 2.9.0 | for the [RTP node-type](nodes/rtp.md) | optional | BSD 3 | -| [libuldaq](https://github.com/mccdaq/uldaq) | >= 1.0.0 | for the [ULDAQ node-type](nodes/uldaq.md) | optional | MIT | -| [libxil](https://github.com/VILLASframework/libxil) | >= 1.0.0 | for the [VILLASfpga node-type](nodes/fpga.md) | optional | MIT | -| [libzmq](http://zeromq.org) | >= 2.2.0 | for the [ZeroMQ node-type](nodes/zeromq.md) | optional | MPL-2.0 | -| [Lua](http://www.lua.org/) | >= 5.1 | for the [Lua hook](hooks/lua.md) | optional | MIT | -| [mosquitto](https://mosquitto.org) | >= 1.4.15 | for the [MQTT node-type](nodes/mqtt.md) | optional | EPL 2 | -| [protobuf-c](https://github.com/protobuf-c/protobuf-c/) | >= 1.1.0 | for the [Protobuf format-type](formats/protobuf.md) | optional | similar to BSD | -| [protobuf](https://github.com/google/protobuf) | >= 2.6.0 | for the [Protobuf format-type](formats/protobuf.md) | optional | similar to BSD | -| [rabbitmq-c](https://github.com/alanxz/rabbitmq-c) | >= 0.8.0 | for the [AMQP node-type](nodes/amqp.md) | optional | MIT | -| [rdkafka](https://github.com/edenhill/librdkafka) | >= 1.5.0 | for the [Kafka node-type](nodes/kafka.md) | optional | BSD | +| Package | Version | Purpose | Optional | License | +| --------------------------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------- | -------- | ------------------ | +| [CMake](http://cmake.org/) | >= 3.9 | for generating the build-system | required | BSD 3 | +| [fmtlib](https://github.com/fmtlib/fmt) | >= 6.1.2 | for string formatting | required | MIT | +| [libcurl](https://curl.haxx.se/libcurl/) | >= 7.29.0 | for HTTP REST requests by the [NGSI node-type](nodes/ngsi.md) node-type | required | similar to MIT | +| [libjansson](http://www.digip.org/jansson/) | >= 2.7 | JSON parser for [Websocket node-type](nodes/websocket.md) and [NGSI node-type](nodes/ngsi.md) node-types | required | MIT | +| [libuuid](https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git) | >= 2.29 | - | required | BSD | +| [libwebsockets](http://libwebsockets.org) | >= 3.1.0 | for the [Websocket node-type](nodes/websocket.md) | required | MIT | +| [openssl](https://www.openssl.org) | >= 1.0.0 | for cryptographic hashing functions | required | Apache 2 for >=3.0 | +| [spdlog](https://github.com/gabime/spdlog) | >= 1.8.2 | for logging | required | MIT | +| [comedilib](http://comedi.org) | >= 0.11.0 | for the [Comedi node-type](nodes/comedi.md) | optional | LGPL-2.1 | +| [Criterion](https://github.com/Snaipe/Criterion) | >= 2.3.1 | for running the unit tests | optional | MIT | +| [Etherlab](http://etherlab.org) | >= 1.5.2 | for the [Ethercat node-type](nodes/ethercat.md) | optional | __GPL 3__ | +| [Graphviz](https://graphviz.org/) | >= 2.30 | for the visualisation of configuration files | optional | EPL | +| [libconfig](http://www.hyperrealm.com/libconfig/) | >= 1.4.9 | for parsing the configuration file | optional | LGPL-2.1 | +| [libdatachannel](https://libdatachannel.org/) | >= 0.18.4 | for the WebRTC node-type | optional | MPL-2.0 | +| [libibverbs](https://github.com/linux-rdma/rdma-core) | >= 16.2 | for the [Infiniband node-type](nodes/infiniband.md) | optional | BSD | +| [libiec61850](http://libiec61850.com/libiec61850/) | >= 1.3.1 | for the [IEC61850-8-1](nodes/iec61850-8-1.md) and [IEC61850-9-2](nodes/iec61850-9-2.md) node-types | optional | __GPL 3__ | +| [libmodbus](https://libmodbus.org/) | >= 3.1.0 | for the [Modbus](nodes/modbus.md) node-type | optional | LGPL-2.1 | +| [libnanomsg](http://nanomsg.org/) | >= 1.0.0 | for the [Nanomsg node-type](nodes/nanomsg.md) | optional | MIT | +| [libnice](https://libnice.freedesktop.org/) | >= 0.1.16 | for libdatachannel / WebRTC | optional | MPL-1.1 & LGPL-2.1 | +| [libnl3](http://www.infradead.org/~tgr/libnl/) | >= 3.2.27 | for the network communication & emulation support of the [Socket node-type](nodes/socket.md) node-type | optional | LGPL-2.1 | +| [librdmacm](https://github.com/linux-rdma/rdma-core) | >= 16.2 | for the [Infiniband node-type](nodes/infiniband.md) | optional | BSD | +| [libre](http://www.creytiv.com/re.html) | >= 2.9.0 | for the [RTP node-type](nodes/rtp.md) | optional | BSD 3 | +| [libuldaq](https://github.com/mccdaq/uldaq) | >= 1.0.0 | for the [ULDAQ node-type](nodes/uldaq.md) | optional | MIT | +| [libxil](https://github.com/VILLASframework/libxil) | >= 1.0.0 | for the [VILLASfpga node-type](nodes/fpga.md) | optional | MIT | +| [libzmq](http://zeromq.org) | >= 2.2.0 | for the [ZeroMQ node-type](nodes/zeromq.md) | optional | MPL-2.0 | +| [Lua](http://www.lua.org/) | >= 5.1 | for the [Lua hook](hooks/lua.md) | optional | MIT | +| [mosquitto](https://mosquitto.org) | >= 1.4.15 | for the [MQTT node-type](nodes/mqtt.md) | optional | EPL 2 | +| [protobuf-c](https://github.com/protobuf-c/protobuf-c/) | >= 1.1.0 | for the [Protobuf format-type](formats/protobuf.md) | optional | similar to BSD | +| [protobuf](https://github.com/google/protobuf) | >= 2.6.0 | for the [Protobuf format-type](formats/protobuf.md) | optional | similar to BSD | +| [rabbitmq-c](https://github.com/alanxz/rabbitmq-c) | >= 0.8.0 | for the [AMQP node-type](nodes/amqp.md) | optional | MIT | +| [rdkafka](https://github.com/edenhill/librdkafka) | >= 1.5.0 | for the [Kafka node-type](nodes/kafka.md) | optional | BSD | There are three ways to install these dependencies: @@ -192,12 +216,10 @@ DEPS_INCLUDE='uldaq jansson' bash packaging/deps.sh DEPS_SKIP='libre rdkafka' bash packaging/deps.sh ``` -## Compile and install +### Compile VILLASnode `VILLASnode` uses CMake for the build and install process. -### Simple build - Simply build VILLASnode with all features available for the dependencies installed on your system. ```shell @@ -211,7 +233,7 @@ cmake --build ./build ./build/src/villas-node -h ``` -### Installation +### Install VILLASnode You can also install the binaries and tools into to your search path after building them. @@ -288,7 +310,7 @@ This can be achieved by using the `WITHOUT_GPL` CMake option: cmake -S . -B build -DWITHOUT_GPL=ON ``` -## Single-binary / Standalone Executable {#standalone} +## Pre-compiled standalone binary {#standalone} We provide single-binary / standalone executable builds of VILLASnode bundle all depdendencies in a [self-extracting ARX archive](https://en.wikipedia.org/wiki/Self-extracting_archive). These standalone binaries allow running VILLASnode irrespectively of the underlying Linux distribution or availability of library dependencies. @@ -311,7 +333,23 @@ The standalone VILLASnode binary is currently only compatible Linux systems runn - ARM v8 Aarch64 :::: -## Docker images {#docker} +## Pre-compiled RPM package {#rpm} + +VILLASnode can be installed from an pre-compiled package on systems with which use the RPM package manager, such as: + +- Fedora and derivatives +- Redhat Enterprise Linux +- CentOS stream +- Rocky Linux + +```shell +rpm \ + --install \ + --excludepath=/usr/lib/.build-id/ \ + 'https://git.rwth-aachen.de/api/v4/projects/79039/jobs/artifacts/master/raw/artifacts/villas-x86_64-linux.rpm?job=pkg:nix:rpm:%20[x86_64-linux]' +``` + +## Docker Images {#docker} There exists a set of Docker images for running and developing VILLASnode. Docker images are available for x86_64/amd64, armhf and arm64 architectures it you can run it also on a Raspberry Pi or other embedded platforms. diff --git a/docs/node/nodes/opal/opal_async.md b/docs/node/nodes/opal/opal_async.md index d8b0e69c..47ef3ffa 100644 --- a/docs/node/nodes/opal/opal_async.md +++ b/docs/node/nodes/opal/opal_async.md @@ -14,7 +14,7 @@ They are used to exchange data between RT-LAB Simulink models and custom user-de :::danger[Deprecation] The `opal.async` node-type is deprecated for the following reasons. -**Please consider the more actively supported [`opal.orchestra`](./orchestra) node-type instead!** +**Please consider the more actively supported [`opal.orchestra`](./opal_orchestra) node-type instead!** - The OPAL-RT **HYPERSIM** simulation environment is not supported. - Older targets running RHEL / CentOS operating systems are not supported. From 911650e22459ce633b87b5fe8529920a380de9ea Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 30 Nov 2025 18:12:08 +0100 Subject: [PATCH 4/4] Updated Git sub-module of VILLAScontroller Signed-off-by: Steffen Vogel --- external/controller | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/controller b/external/controller index 039870a7..53324a18 160000 --- a/external/controller +++ b/external/controller @@ -1 +1 @@ -Subproject commit 039870a7b3e43121ba5bcfe8fa0f49898aea30ce +Subproject commit 53324a1872afd58ee173e693e5485b231a3e884d