Linux 硬实时内核搭建 + Python 实现 CANopen/EtherCAT 工业总线实战培训文档

文档说明

 
  1. 文档类型:免费公开课培训讲义,配套 PPT 授课使用,全程可落地实操
  2. 适用人群:嵌入式开发、工控自动化、机器人、设备调试工程师、在校学生
  3. 学习路线:虚拟机环境搭建→Linux 原生内核编译→RT 实时内核编译部署→系统硬实时调优→工业总线场景讲解→Python CANopen 实战→Python EtherCAT 实战→行业应用场景
  4. 配套环境:VMware Workstation、Ubuntu22.04、RT-Linux 实时补丁、USBCAN、EtherCAT 工业网卡、Python3
 

目录

 
第一章 课程概述与工业总线应用场景科普
 
第二章 实操环境搭建(VMware+Ubuntu 编译环境)
 
第三章 Linux 原生内核源码下载、配置、编译、完整安装
 
第四章 实时系统理论:RT-Linux 硬实时原理
 
第五章 RT-Linux 实时内核打补丁、编译、切换系统实操
 
第六章 Linux 系统全方位硬实时性能优化全套方案
 
第七章 CAN 总线基础 + Python CANopen 通信完整实操
 
第八章 EtherCAT 总线基础 + Python EtherCAT 主站开发实战
 
第九章 实时总线综合项目与行业应用场景
 
第十章 常见故障排查、课后练习与配套资料
 

第一章 课程概述与工业总线应用场景科普

 

1.1 课程学习目标

 
  1. 独立完成虚拟机编译环境搭建,从零编译原版 Linux 内核
  2. 掌握 RT-Linux 实时补丁原理,自主编译、部署硬实时内核
  3. 掌握 CPU 隔离、关闭桌面、禁用 Swap、进程优先级等全套实时优化手段
  4. 使用 Python 完成 CANopen 设备组网、数据收发、伺服控制
  5. 使用 Python 开发 EtherCAT 高速实时运动控制程序
  6. 搭建一套微秒级延迟的工控实时控制平台,可用于小型自动化设备开发
 

1.2 硬件与软件前置准备

 

软件清单

 
  1. VMware Workstation Pro 16/17
  2. Ubuntu 22.04 LTS 桌面版镜像
  3. Linux 官方内核源码包、对应版本 RT 实时补丁
  4. Python3、python-can、pysoem、libethercat 等工控依赖库
 

硬件清单

 
  1. 主机:内存≥16G,CPU 多核 8 核及以上(CPU 隔离必备),空闲磁盘≥100G
  2. 通信硬件:USBCAN/CANable 分析仪、EtherCAT 工业网卡、伺服电机 / IO 从站
  3. 外设:USB 拓展坞(用于挂载 CAN 设备)
 

1.3 软实时与硬实时核心区别(工控核心知识点)

 
  1. 普通 Linux(软实时)
     
    无实时补丁,调度延迟几十~数百毫秒,调度不确定,仅适用于数据采集、后台服务,无法用于伺服运动控制。
  2. RT-Linux(硬实时)
     
    增加 PREEMPT_RT 实时补丁,中断优先级置顶,调度延迟稳定微秒级,满足机器人、多轴同步、高速产线控制要求。
 

1.4 CANopen 总线工业应用场景

 
CANopen 基于 CAN 物理层,是中小型设备主流现场总线,成本低、抗干扰强。
 
  1. 移动装备:AGV 无人小车、叉车、工程机械、新能源整车控制器
  2. 小型自动化设备:包装机、纺织机械、小型数控机床、3C 小型检测设备
  3. 传感器组网:多路压力、位移、温湿度传感器集群采集
  4. 医疗设备、楼宇自控、小型伺服驱动联动
     
    优缺点:最高 1Mbps 传输速率,布线简单成本低;传输距离短、多轴同步性能弱,不适合高速高精度产线。
 

1.5 EtherCAT 总线工业应用场景

 
工业以太网高速实时总线,当前高端运动控制主流方案。
 
  1. 高精度多轴设备:六轴机械臂、多轴伺服贴片机、锂电池卷绕设备
  2. 半导体、光伏自动化产线、高速注塑机
  3. 大型智能仓储 AGV 集群、大型流水线 IO 控制
  4. 数控加工中心、高精度检测设备
     
    优缺点:百兆 / 千兆带宽,微秒级同步,支持上百轴同步;硬件成本更高,需专用工业网卡适配实时系统。
 

1.6 Python 操作工业总线的优势

 
  1. 开发速度快,无需大量底层 C 语言开发,快速验证控制逻辑
  2. 成熟开源库:python-can(CAN/CANopen)、pysoem(EtherCAT 主站)开箱即用
  3. 上层业务友好:搭配数据可视化、上位机界面、日志采集快速开发
  4. 底层实时由 RT-Linux 内核保障,Python 仅负责业务逻辑控制
 

第二章 实操环境搭建(VMware+Ubuntu 编译环境)

 

2.1 VMware 虚拟机安装配置步骤

 
  1. 右键管理员运行 VMware 安装包,默认路径完成安装,关闭杀毒软件拦截。
  2. 新建虚拟机,选择【自定义(高级)】模式,硬件兼容性选择最新版本。
  3. 镜像来源选择【稍后安装操作系统】,系统选择 Linux-Ubuntu 64 位。
  4. 虚拟机命名与存储:磁盘分区剩余空间≥80G,路径无中文、空格。
  5. CPU 分配:推荐 6 核 / 8 核,勾选虚拟化引擎(虚拟化性能计数器)。
  6. 内存分配:最低 8G,推荐 12G/16G(内核编译占用大量内存)。
  7. 硬盘设置:新建虚拟磁盘,大小 80G 以上,选择【将虚拟磁盘存储为单个文件】。
  8. 网络适配器:修改为【桥接模式】,便于外接 USB-CAN、EtherCAT 硬件透传。
  9. USB 控制器:开启 USB3.0 兼容,保证 USB 工业设备正常识别。
 

2.2 Ubuntu 22.04 系统安装步骤

 
  1. 虚拟机设置中挂载 Ubuntu22.04 ISO 镜像,开启虚拟机。
  2. 语言选择中文,安装类型选择【正常安装】,勾选下载更新、第三方驱动。
  3. 磁盘分区:选择整个磁盘自动分区(学习环境无需手动分区)。
  4. 设置时区上海,创建用户名(建议不要使用 root 直接登录),设置密码。
  5. 等待系统安装完成,重启虚拟机,移除 ISO 镜像。
 

2.3 虚拟机 USB 设备透传配置(关键,总线硬件必备)

 
  1. 插入 USBCAN、EtherCAT 网卡,虚拟机顶部菜单栏【虚拟机】-【可移动设备】。
  2. 勾选对应 USB 设备名称,将硬件挂载至 Ubuntu 系统。
  3. 若设备频繁断开:VMware 编辑 - 首选项 - USB,调整 USB 兼容优先级。
 

2.4 基础编译依赖环境一键安装

 
打开终端,逐条执行命令:
 
bash
 
 
# 更新软件源
sudo apt update && sudo apt upgrade -y
# 内核编译全套依赖
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev git dwarves -y
# Python工控开发依赖
sudo apt install python3 python3-pip python3-dev git -y
# CAN/EtherCAT底层依赖库
sudo apt install can-utils net-tools iproute2 libtool autoconf automake -y
# 安装Python工具
pip3 install python-can pysoem numpy
 
 

2.5 共享文件夹配置(主机与虚拟机文件互传)

 
  1. 虚拟机设置 - 选项 - 共享文件夹,启用【总是启用】,添加主机文件夹路径。
  2. 终端安装 VMware 工具:
 
bash
 
 
sudo apt install open-vm-tools open-vm-tools-desktop -y
 
 
  1. 重启生效,共享文件默认路径 /mnt/hgfs/
 

第三章 Linux 原生内核源码下载、配置、编译、完整安装

 

3.1 内核源码下载

 
  1. 创建源码存放目录
 
bash
 
 
mkdir ~/linux_kernel && cd ~/linux_kernel
 
 
  1. 官网下载稳定版内核(示例 5.15 长期支持版,适配 RT 补丁)
 
bash
 
 
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.100.tar.xz
# 解压源码包
tar -xf linux-5.15.100.tar.xz
cd linux-5.15.100
 
 

3.2 拷贝当前系统内核配置(避免手动配置大量选项)

 
bash
 
 
cp -v /boot/config-$(uname -r) .config
 
 

3.3 内核可视化配置

 
bash
 
 
make menuconfig
 
 
基础配置说明:
 
  1. 开启 CAN 总线支持:Device Drivers → Network device support → CAN bus subsystem support 全部勾选
  2. 开启以太网高级功能(适配 EtherCAT):Device Drivers → Network device support 千兆网卡驱动全选
  3. 保存配置退出,生成新.config 文件
 

3.4 内核编译(多核并行编译,-j 后数字等于 CPU 核心数)

 
bash
 
 
make -j$(nproc)
# 编译内核模块
make modules -j$(nproc)
 
 

3.5 安装内核模块与系统内核镜像

 
bash
 
 
# 安装模块到系统
sudo make modules_install
# 安装内核镜像、更新grub启动菜单
sudo make install
 
 

3.6 切换内核验证

 
  1. 重启虚拟机:sudo reboot
  2. 开机时长按 Shift 调出 GRUB 菜单,选择新编译内核启动
  3. 终端验证当前内核版本
 
bash
 
 
uname -r
 
 

第四章 实时系统理论:RT-Linux 硬实时原理

 

4.1 PREEMPT_RT 补丁核心作用

 
普通 Linux 采用 CFS 完全公平调度器,为保证多任务公平会产生调度延迟;PREEMPT_RT 补丁改造内核:
 
  1. 将内核大部分代码改为可抢占模式,中断线程化
  2. 区分普通进程与实时进程,实时进程优先级高于一切后台任务
  3. 自旋锁替换为可抢占互斥锁,大幅降低中断、任务切换延迟
 

4.2 实时调度策略分类

 
  1. SCHED_FIFO:先进先出实时调度,高优先级任务持续运行直到主动放弃 CPU
  2. SCHED_RR:时间片轮转实时调度,同优先级任务分时运行
  3. SCHED_OTHER:普通 Linux 分时调度,无实时性
 

4.3 实时延迟影响因素

 
  1. 桌面图形界面、后台服务频繁抢占 CPU
  2. Swap 内存交换、磁盘 IO 阻塞
  3. 多核 CPU 调度漂移、中断跨核心分配
  4. 网卡、声卡、蓝牙等外设频繁中断干扰
 

第五章 RT-Linux 实时内核打补丁、编译、切换系统实操

 

5.1 下载对应版本 RT 补丁

 
内核版本必须与 RT 补丁版本完全匹配,示例 linux-5.15.100 对应 rt 补丁:
 
bash
 
 
cd ~/linux_kernel
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.100-rt66.patch.xz
# 解压补丁
xz -d patch-5.15.100-rt66.patch.xz
cd linux-5.15.100
 
 

5.2 源码打实时补丁

 
bash
 
 
patch -p1 < ../patch-5.15.100-rt66.patch
 
 
无报错即代表补丁打入成功。
 

5.3 开启实时内核配置

 
bash
 
 
make menuconfig
 
 
关键配置项:
 
  1. General setup → Preemption Model 选择 Fully Preemptible Kernel (RT)
  2. 开启 High Resolution Timer 高精度定时器
  3. 关闭内存压缩、后台休眠相关功能
  4. 保留 CAN、以太网驱动支持,保存退出
 

5.4 编译安装 RT 实时内核

 
bash
 
 
make -j$(nproc)
make modules -j$(nproc)
sudo make modules_install
sudo make install
sudo update-grub
 
 

5.5 启动 RT 内核并验证实时功能

 
  1. 重启,GRUB 菜单选择带 rt 标识内核启动
  2. 验证实时补丁是否生效
 
bash
 
 
uname -r
# 输出包含rt即为实时内核
# 查看抢占模式
zcat /proc/config.gz | grep PREEMPT_RT
# 返回y代表开启成功
 
 

5.6 实时延迟测试工具安装与测试

 
bash
 
 
sudo apt install rt-tests -y
# 周期性延迟测试,查看最大延迟
cyclictest -t1 -p99 -n -i1000 -l100000
 
 
标准硬实时系统最大延迟应控制在几十微秒内。
 

第六章 Linux 系统全方位硬实时性能优化全套方案

 

6.1 关闭图形桌面环境(消除 GUI 调度干扰)

 
  1. 切换系统为命令行启动
 
bash
 
 
sudo systemctl set-default multi-user.target
# 临时关闭当前桌面
sudo systemctl stop gdm3
 
 
  1. 需要桌面时恢复:
 
bash
 
 
sudo systemctl set-default graphical.target
 
 

6.2 禁用 Swap 交换分区(防止磁盘 IO 造成延迟抖动)

 
bash
 
 
# 临时关闭swap
sudo swapoff -a
# 永久禁用,注释fstab内swap行
sudo vim /etc/fstab
# 删除swap对应配置,重启永久生效
 
 

6.3 CPU 核心隔离(关键优化,专门核心运行实时总线程序)

 
  1. 修改 GRUB 启动参数,隔离 CPU2、CPU3(示例 4 核 CPU)
 
bash
 
 
sudo vim /etc/default/grub
# 修改内核启动参数
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3"
# 更新grub
sudo update-grub
sudo reboot
 
 
  1. 隔离后,普通系统进程不会占用 2、3 核心,仅运行我们的 Python 实时总线程序。
 

6.4 调高实时进程优先级

 
运行 Python 程序时指定实时调度策略与最高优先级 99:
 
bash
 
 
# 安装调度工具
sudo apt install chrt
# FIFO实时调度运行脚本
sudo chrt -f -p 99 python3 canopen_main.py
 
 

6.5 关闭无用后台服务、外设中断

 
  1. 禁用蓝牙、声卡、自动更新服务
 
bash
 
 
sudo systemctl disable --now bluetooth
sudo systemctl disable --now apt-daily apt-daily-upgrade
 
 
  1. 将网卡、CAN 设备中断绑定至隔离 CPU 核心,避免中断漂移。
 

6.6 磁盘 IO 优化

 
关闭磁盘自动挂载、磁盘写入缓存同步调优,减少 IO 阻塞延迟。
 

第七章 CAN 总线基础 + Python CANopen 通信完整实操

 

7.1 CAN 总线基础概念

 
CAN 总线为差分串行总线,多节点串行通信;CANopen 是基于 CAN 的高层应用协议,定义 PDO 过程数据、SDO 服务数据、NMT 网络管理,用于伺服、IO 设备控制。
 

7.2 USB-CAN 硬件配置

 
  1. 插入 USBCAN,查看 CAN 设备名称
 
bash
 
 
ip link show
# 加载CAN驱动
sudo modprobe can
sudo modprobe can_raw
sudo modprobe vcan
# 配置CAN波特率250k
sudo ip link set can0 type can bitrate 250000
sudo ip link set can0 up
 
 

7.3 Python CANopen 基础收发示例

 
创建 canopen_demo.py
 
python
 
 
import can
# 绑定can0总线
bus = can.Bus(interface="socketcan", channel="can0", bitrate=250000)
# 发送标准CAN帧
msg = can.Message(arbitration_id=0x123, data=[0x01,0x02,0x03,0x04], is_extended_id=False)
bus.send(msg)
# 循环接收总线数据
while True:
    recv_msg = bus.recv()
    print(f"接收ID:{recv_msg.arbitration_id},数据:{recv_msg.data}")
 
 
高优先级实时运行脚本:
 
bash
 
 
sudo chrt -f -p 99 python3 canopen_demo.py
 
 

7.4 CANopen 标准功能开发

 
  1. NMT 设备启停、复位
  2. PDO 实时周期数据收发(伺服位置、速度实时反馈)
  3. SDO 读写设备参数(伺服最大转速、限位参数配置)
  4. 多节点 CANopen 组网调试、总线故障检测
 

第八章 EtherCAT 总线基础 + Python EtherCAT 主站开发实战

 

8.1 EtherCAT 基础原理

 
EtherCAT 采用数据帧串行转发机制,一帧数据遍历所有从站,硬件完成数据读写,延迟极低;分为主站(PC / 工控机)、伺服 / IO 从站。Linux 下 SOEM 开源库支持 EtherCAT 主站,Python 封装 pysoem 可快速开发。
 

8.2 工业网卡实时配置

 
关闭网卡节能、巨帧、硬件卸载,降低网卡中断延迟:
 
bash
 
 
sudo ethtool -G eth0 rx 1024 tx 1024
sudo ethtool -K eth0 tx off rx off
 
 

8.3 Python SOEM EtherCAT 主站示例代码

 
ethercat_main.py
 
python
 
 
import pysoem
import time

# 扫描EtherCAT网卡
master = pysoem.Master()
master.open("eth0")
# 扫描总线上所有从站
if master.config_init() > 0:
    master.config_map()
    # 切换所有从站至运行状态
    master.state_check(pysoem.SAFEOP_STATE, 50000)
    master.state = pysoem.OP_STATE
    master.write_state()
    # 周期实时读写伺服数据
    while True:
        master.send_processdata()
        master.receive_processdata(1000)
        # 读取伺服实际位置
        pos = master.slaves[0].inputs.uint32[0]
        # 写入目标速度
        master.slaves[0].outputs.uint32[0] = 5000
        time.sleep(0.001)
master.close()
 
 
实时高优先级运行:
 
bash
 
 
sudo chrt -f -p 99 python3 ethercat_main.py
 
 

8.4 EtherCAT 开发核心功能

 
  1. 总线扫描、从站识别、状态机切换(INIT→PREOP→SAFEOP→OP)
  2. PDO 过程数据周期高速读写(多轴同步运动控制)
  3. SDO 参数读写伺服厂商参数
  4. 总线断线、从站故障实时检测报警
 

第九章 实时总线综合项目与行业应用场景

 

9.1 小型 AGV 小车综合方案

 
硬件:RT-Linux 工控机 + USBCAN+CANopen 伺服电机
 
功能:Python 实现底盘行走控制、避障传感器采集、路径规划,硬实时保证车轮速度同步。
 

9.2 多轴伺服运动控制平台

 
硬件:RT-Linux+EtherCAT 工业网卡 + 多台 EtherCAT 伺服
 
应用:3C 点胶、贴标设备,微秒级多轴同步,轨迹连续无抖动。
 

9.3 产线 IO 数据采集控制系统

 
CANopen 多路传感器采集 + EtherCAT 高速执行机构联动,实时上传生产数据至上位机。
 

9.4 新能源设备控制器

 
CANopen 总线电池管理系统 BMS 数据采集,实时监控电压、电流、温度。
posted @ 2026-07-03 17:35  鬼门元歌  阅读(61)  评论(0)    收藏  举报