Marco Mondin Inserito: 26 febbraio 2020 Segnala Share Inserito: 26 febbraio 2020 (modificato) 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... Modificato: 26 febbraio 2020 da Marco Mondin Link al commento Condividi su altri siti More sharing options...
datzori Inserita: 14 giugno 2020 Segnala Share Inserita: 14 giugno 2020 io sono interessato! è una tecnica che mi interessa approfondire. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora