Jump to content
PLC Forum

Marco Mondin

Ecco come installare Codesys Runtime su Linux in RealTime.

Recommended Posts

Marco Mondin

   Apro questa discussione in quanto potrebbe tornare utile a qualcuno.
Da alcune versioni è possibile installare il runtime Codesys anche su linux con prestazioni notevoli in RealTime! Paragonabili se non superiori a quelle del Runtime RTE di Windows.

Se foste interessati a fare eventuali prove consiglio molto vivamente di partire da una distribuzione Debian, su Debian Buster è possibile installare un kernel preemptive RealTime direttamente dai repositories, senza la rottura di scatole del doversi compilare un kernel con estensioni RealTime (Compilandolo si può ancora migliorare qualcosa, ma già così il jitter permette ethercat e ciclica a 250us).

Disabilitare l'hyperthreading ed il turbo da BIOS!!!

Per installare il kernel basta il seguente comando:

$ sudo apt-get install linux-image-rt-amd64


Se selezionandolo da grub si avvia senza problemi si può rimuovere il kernel tradizionale non RT

$ sudo apt-get remove linux-image-4.19.0-6-amd64

Avendo cura di sostituire la versione 4.19.0-6 con quelle installate (Potreste averne più di una)


Se volete pulire dipendenze non più utili

$ sudo apt-get autoremove


A questo punto quasi tutto è fatto! Tuttavia per avere un buon RealTime sarebbe meglio o meglio è quasi obbligatorio dedicare 1 core tutto a Codesys per fare questo esiste una tecnica chiamata CPU pinning.
Premetto che di suo il runtime preinstallato con il pacchetto .deb fornito da 3S Smart Solutions effettua già un task affinity al primo core della CPU, quindi per comodità meglio isolare quello.
NOTA: Se avete un ATOM potete isolare tranquillamente un solo core, se avete un iCore meglio isolare anche quello adiacente in quanto condividono alcune cosette a coppie e degenera il jitter.
 

$ sudo nano /etc/default/grub

Modificate la riga GRUB_CMDLINE_DEFAULT così (io ho un i5, quindi isolo i core 0 e 1) (isolcpus è la direttiva fondamentale)

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=0 splash acpi=force isolcpus=0,1 nohz_full=0,1"

In questo modo i core 0 e 1 non verranno usati per nulla dal sistema operativo e Codesys si impadronirà del core 0.

CTRL+X, seguito da y per salvare poi aggiornate grub:

$ sudo update-grub


Nella cartella creata per il runtime quando scaricate tale runtime dal sito Codesys troverete un file chiamato codesyscontrol_x64_linux_VOSTRA_VERSIONE.deb, copiatelo nel pc con Linux ed installatelo con:

$ sudo dpkg -i codesyscontrol_x64_linux_VOSTRA_VERSIONE.deb

 

Ora non rimane che fissare la frequenza della CPU al suo massimo evitando il throttling che comprometterebbe il RealTime, per farlo ho creato uno script che fa uso di cpufreq-set:

#!/bin/sh 
MAX=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
MIN=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq)
cpufreq-set -c 0 -g performance
cpufreq-set -c 1 -g performance
cpufreq-set -c 2 -g powersave
cpufreq-set -c 3 -g powersave
cpupower -c 0 frequency-set -u $MAX
cpupower -c 0 frequency-set -d $MAX
cpupower -c 1 frequency-set -u $MAX
cpupower -c 1 frequency-set -d $MAX
cpupower -c 2 frequency-set -u $MAX
cpupower -c 2 frequency-set -d $MIN
cpupower -c 3 frequency-set -u $MAX
cpupower -c 3 frequency-set -d $MIN
echo 0 > /sys/bus/workqueue/devices/writeback/numa
echo 12 > /sys/bus/workqueue/devices/writeback/cpumask
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
echo 1000 > /proc/sys/vm/stat_interval
echo 0 >/sys/devices/system/machinecheck/machinecheck0/check_interval
echo 0 >/sys/devices/system/machinecheck/machinecheck1/check_interval
echo 0 > /proc/sys/kernel/watchdog
echo 0 > /proc/sys/kernel/nmi_watchdog
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs

Ho messo questo script in /usr/local/bin e lo lancio ad ogni avvio.
Io ho usato una UNIT systemd, ma potete fare come preferite.
Probabilmente avete bisogno di un pacchetto chiamato cpufrequtils:

$ sudo apt-get install cpufrequtils

Tale script fissa la frequenza dei cores isolati e lascia libera di throttare quella degli altri.

Se è filato tutto liscio ora avete la vostra macchina con un codesys linux con prestazioni simili al runtime RTE.
Noi lo usiamo in produzione con CN, interpolazione e sistemi customizzati di controllo PID tutto su ethercat!

Per avviare, fermare o riavviare il runtime bastano i seguenti comandi:
 

$ sudo systemctl start codesyscontrol
$ sudo systemctl stop codesyscontrol
$ sudo systemctl restart codesyscontrol


Anche su linux è possibile la gestione della shared memory per condividere strutture dati tra Runtime Codesys ed applicativi PC, ma questa è un'altra storia che potrei raccontare se qualcuno è interessato...
 

Edited by Marco Mondin
Link to post
Share on other sites

datzori

io sono interessato! è una tecnica che mi interessa approfondire.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...