How to simulate IDCP on a Linux PC

Note

Currently (Feb. 2026) idcp cannot be built from public repositories, so the following recipe only works at the Helmholtz-Zentrum Berlin. In the future it will be possible to build everything from public repositories. See also Sites.

Overview

We build an undulator emulation, a digital twin, and and the undulator control program, idcp.

Since both communicate by CAN bus, we can use the Linux Virtual CAN Driver to run both applications on a single Linux PC without a physical CAN Bus interface.

All functions, even speed control, can be tested on a single Linux PC.

We create these directories:

VENV

The Python virtual environment where extra Python applications and scripts and some Perl scripts and libraries are installed.

SUMO

The sumo directory that contains the sumo database and all EPICS device supports.

unisim

The The unisim application application that implements the simulation of the undulator, a digital twin.

idcp

The idcp application, the undulator control application.

Prerequisites (incomplete)

  • Development packages: gcc, g++, make, Perl, Python

  • Version control: darcs, mercurial, git

  • Access to http://repo.acc.bessy.de

  • sudo rights on your local machine

unisim

Note

For details on unisim see The unisim application.

Check out with:

hg clone http://repo.acc.bessy.de/hg/unisim

Initialize:

cd unisim
./configure.sh --venv ../VENV --sumodir ../SUMO -c custom-HZB.sh --system-site-packages

Build:

./build.sh

Note: The “configure.sh” call initializes a Python Virtual Environment as well as a SUMO directory.

Change to parent directory:

cd ..

Important: Activate Python Virtual Environment:

source VENV/bin/activate

idcp

Check out with:

hg clone http://repo.acc.bessy.de/hg/idcp/idcp

Change directory:

cd idcp

Configure:

./idcp-configure --arch linux --no-repo --venv ../VENV --system-site-packages

Configure shell:

source ./setenv.sh

Build supports:

nice sumo build utilize --makeflags "-sj" --progress

Build application:

nice make -sj

Configure virtual CAN Bus

This uses two utility scripts from the ‘socan’ device support.

Note: You need to have sudo rights for this.

In the idcp directory enter:

source ./setenv-socan.sh
init-can.sh -d vcan -p 0 5
link-vcan-devices.sh link 2 4

Start unisim

In a new terminal in the unisim directory run:

./start-ioc.sh --sudo

Note

Possibly start the script above with option “–ip IPADDRESS” if you host has more than one network interface.

Start idcp

In a new terminal in the idcp directory run:

scripts/start-ioc.sh --sudo --local idcp98

Note

Possibly start the script above with option “–ip IPADDRESS” if you host has more than one network interface.

Initialize undulator

In another terminal window in the “idcp” directory run:

source setenv.sh
source setenv-epics-base.sh
source setenv-iddb.sh
BOOT.sh U2IV -V 150 -H 0 --no-cioc reset

Note

The message “‘healthy’ flag for at least one axle is not set” is not an error here, this is a small difference between the simulation and the real undulator.

Start DM2K

Note: You must have “DM2K” installed on you local host.

DM2K source can be downloaded here:

https://github.com/goetzpf/DM2K-HZB

In a new terminal in the idcp directory enter:

scripts/dm2k-local.sh U2IV

Use

You can now do everything on the simulated undulator you could do in the real undulator.

For example:

  • Enter ‘100’ at ‘Dest:’

  • Below change the button from ‘STOP’ to ‘START’.

  • On the right side of this button click on ‘exec’.

You should now see that the undulator moves.

Your find further documentation on the user interface at IDCP User Interface.