Linux 硬实时内核搭建 + Python 实现 CANopen/EtherCAT 工业总线实战培训文档
文档说明
- 文档类型:免费公开课培训讲义,配套 PPT 授课使用,全程可落地实操
- 适用人群:嵌入式开发、工控自动化、机器人、设备调试工程师、在校学生
- 学习路线:虚拟机环境搭建→Linux 原生内核编译→RT 实时内核编译部署→系统硬实时调优→工业总线场景讲解→Python CANopen 实战→Python EtherCAT 实战→行业应用场景
- 配套环境: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 课程学习目标
- 独立完成虚拟机编译环境搭建,从零编译原版 Linux 内核
- 掌握 RT-Linux 实时补丁原理,自主编译、部署硬实时内核
- 掌握 CPU 隔离、关闭桌面、禁用 Swap、进程优先级等全套实时优化手段
- 使用 Python 完成 CANopen 设备组网、数据收发、伺服控制
- 使用 Python 开发 EtherCAT 高速实时运动控制程序
- 搭建一套微秒级延迟的工控实时控制平台,可用于小型自动化设备开发
1.2 硬件与软件前置准备
软件清单
- VMware Workstation Pro 16/17
- Ubuntu 22.04 LTS 桌面版镜像
- Linux 官方内核源码包、对应版本 RT 实时补丁
- Python3、python-can、pysoem、libethercat 等工控依赖库
硬件清单
- 主机:内存≥16G,CPU 多核 8 核及以上(CPU 隔离必备),空闲磁盘≥100G
- 通信硬件:USBCAN/CANable 分析仪、EtherCAT 工业网卡、伺服电机 / IO 从站
- 外设:USB 拓展坞(用于挂载 CAN 设备)
1.3 软实时与硬实时核心区别(工控核心知识点)
- 普通 Linux(软实时)
无实时补丁,调度延迟几十~数百毫秒,调度不确定,仅适用于数据采集、后台服务,无法用于伺服运动控制。
- RT-Linux(硬实时)
增加 PREEMPT_RT 实时补丁,中断优先级置顶,调度延迟稳定微秒级,满足机器人、多轴同步、高速产线控制要求。
1.4 CANopen 总线工业应用场景
CANopen 基于 CAN 物理层,是中小型设备主流现场总线,成本低、抗干扰强。
- 移动装备:AGV 无人小车、叉车、工程机械、新能源整车控制器
- 小型自动化设备:包装机、纺织机械、小型数控机床、3C 小型检测设备
- 传感器组网:多路压力、位移、温湿度传感器集群采集
- 医疗设备、楼宇自控、小型伺服驱动联动
优缺点:最高 1Mbps 传输速率,布线简单成本低;传输距离短、多轴同步性能弱,不适合高速高精度产线。
1.5 EtherCAT 总线工业应用场景
工业以太网高速实时总线,当前高端运动控制主流方案。
- 高精度多轴设备:六轴机械臂、多轴伺服贴片机、锂电池卷绕设备
- 半导体、光伏自动化产线、高速注塑机
- 大型智能仓储 AGV 集群、大型流水线 IO 控制
- 数控加工中心、高精度检测设备
优缺点:百兆 / 千兆带宽,微秒级同步,支持上百轴同步;硬件成本更高,需专用工业网卡适配实时系统。
1.6 Python 操作工业总线的优势
- 开发速度快,无需大量底层 C 语言开发,快速验证控制逻辑
- 成熟开源库:python-can(CAN/CANopen)、pysoem(EtherCAT 主站)开箱即用
- 上层业务友好:搭配数据可视化、上位机界面、日志采集快速开发
- 底层实时由 RT-Linux 内核保障,Python 仅负责业务逻辑控制
第二章 实操环境搭建(VMware+Ubuntu 编译环境)
2.1 VMware 虚拟机安装配置步骤
- 右键管理员运行 VMware 安装包,默认路径完成安装,关闭杀毒软件拦截。
- 新建虚拟机,选择【自定义(高级)】模式,硬件兼容性选择最新版本。
- 镜像来源选择【稍后安装操作系统】,系统选择 Linux-Ubuntu 64 位。
- 虚拟机命名与存储:磁盘分区剩余空间≥80G,路径无中文、空格。
- CPU 分配:推荐 6 核 / 8 核,勾选虚拟化引擎(虚拟化性能计数器)。
- 内存分配:最低 8G,推荐 12G/16G(内核编译占用大量内存)。
- 硬盘设置:新建虚拟磁盘,大小 80G 以上,选择【将虚拟磁盘存储为单个文件】。
- 网络适配器:修改为【桥接模式】,便于外接 USB-CAN、EtherCAT 硬件透传。
- USB 控制器:开启 USB3.0 兼容,保证 USB 工业设备正常识别。
2.2 Ubuntu 22.04 系统安装步骤
- 虚拟机设置中挂载 Ubuntu22.04 ISO 镜像,开启虚拟机。
- 语言选择中文,安装类型选择【正常安装】,勾选下载更新、第三方驱动。
- 磁盘分区:选择整个磁盘自动分区(学习环境无需手动分区)。
- 设置时区上海,创建用户名(建议不要使用 root 直接登录),设置密码。
- 等待系统安装完成,重启虚拟机,移除 ISO 镜像。
2.3 虚拟机 USB 设备透传配置(关键,总线硬件必备)
- 插入 USBCAN、EtherCAT 网卡,虚拟机顶部菜单栏【虚拟机】-【可移动设备】。
- 勾选对应 USB 设备名称,将硬件挂载至 Ubuntu 系统。
- 若设备频繁断开: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 共享文件夹配置(主机与虚拟机文件互传)
- 虚拟机设置 - 选项 - 共享文件夹,启用【总是启用】,添加主机文件夹路径。
- 终端安装 VMware 工具:
bash
sudo apt install open-vm-tools open-vm-tools-desktop -y
- 重启生效,共享文件默认路径
/mnt/hgfs/
第三章 Linux 原生内核源码下载、配置、编译、完整安装
3.1 内核源码下载
- 创建源码存放目录
bash
mkdir ~/linux_kernel && cd ~/linux_kernel
- 官网下载稳定版内核(示例 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
基础配置说明:
- 开启 CAN 总线支持:Device Drivers → Network device support → CAN bus subsystem support 全部勾选
- 开启以太网高级功能(适配 EtherCAT):Device Drivers → Network device support 千兆网卡驱动全选
- 保存配置退出,生成新.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 切换内核验证
- 重启虚拟机:
sudo reboot - 开机时长按 Shift 调出 GRUB 菜单,选择新编译内核启动
- 终端验证当前内核版本
bash
uname -r
第四章 实时系统理论:RT-Linux 硬实时原理
4.1 PREEMPT_RT 补丁核心作用
普通 Linux 采用 CFS 完全公平调度器,为保证多任务公平会产生调度延迟;PREEMPT_RT 补丁改造内核:
- 将内核大部分代码改为可抢占模式,中断线程化
- 区分普通进程与实时进程,实时进程优先级高于一切后台任务
- 自旋锁替换为可抢占互斥锁,大幅降低中断、任务切换延迟
4.2 实时调度策略分类
- SCHED_FIFO:先进先出实时调度,高优先级任务持续运行直到主动放弃 CPU
- SCHED_RR:时间片轮转实时调度,同优先级任务分时运行
- SCHED_OTHER:普通 Linux 分时调度,无实时性
4.3 实时延迟影响因素
- 桌面图形界面、后台服务频繁抢占 CPU
- Swap 内存交换、磁盘 IO 阻塞
- 多核 CPU 调度漂移、中断跨核心分配
- 网卡、声卡、蓝牙等外设频繁中断干扰
第五章 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
关键配置项:
- General setup → Preemption Model 选择 Fully Preemptible Kernel (RT)
- 开启 High Resolution Timer 高精度定时器
- 关闭内存压缩、后台休眠相关功能
- 保留 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 内核并验证实时功能
- 重启,GRUB 菜单选择带 rt 标识内核启动
- 验证实时补丁是否生效
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 调度干扰)
- 切换系统为命令行启动
bash
sudo systemctl set-default multi-user.target
# 临时关闭当前桌面
sudo systemctl stop gdm3
- 需要桌面时恢复:
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 核心隔离(关键优化,专门核心运行实时总线程序)
- 修改 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
- 隔离后,普通系统进程不会占用 2、3 核心,仅运行我们的 Python 实时总线程序。
6.4 调高实时进程优先级
运行 Python 程序时指定实时调度策略与最高优先级 99:
bash
# 安装调度工具
sudo apt install chrt
# FIFO实时调度运行脚本
sudo chrt -f -p 99 python3 canopen_main.py
6.5 关闭无用后台服务、外设中断
- 禁用蓝牙、声卡、自动更新服务
bash
sudo systemctl disable --now bluetooth
sudo systemctl disable --now apt-daily apt-daily-upgrade
- 将网卡、CAN 设备中断绑定至隔离 CPU 核心,避免中断漂移。
6.6 磁盘 IO 优化
关闭磁盘自动挂载、磁盘写入缓存同步调优,减少 IO 阻塞延迟。
第七章 CAN 总线基础 + Python CANopen 通信完整实操
7.1 CAN 总线基础概念
CAN 总线为差分串行总线,多节点串行通信;CANopen 是基于 CAN 的高层应用协议,定义 PDO 过程数据、SDO 服务数据、NMT 网络管理,用于伺服、IO 设备控制。
7.2 USB-CAN 硬件配置
- 插入 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 标准功能开发
- NMT 设备启停、复位
- PDO 实时周期数据收发(伺服位置、速度实时反馈)
- SDO 读写设备参数(伺服最大转速、限位参数配置)
- 多节点 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 开发核心功能
- 总线扫描、从站识别、状态机切换(INIT→PREOP→SAFEOP→OP)
- PDO 过程数据周期高速读写(多轴同步运动控制)
- SDO 参数读写伺服厂商参数
- 总线断线、从站故障实时检测报警
第九章 实时总线综合项目与行业应用场景
9.1 小型 AGV 小车综合方案
硬件:RT-Linux 工控机 + USBCAN+CANopen 伺服电机
功能:Python 实现底盘行走控制、避障传感器采集、路径规划,硬实时保证车轮速度同步。
9.2 多轴伺服运动控制平台
硬件:RT-Linux+EtherCAT 工业网卡 + 多台 EtherCAT 伺服
应用:3C 点胶、贴标设备,微秒级多轴同步,轨迹连续无抖动。
9.3 产线 IO 数据采集控制系统
CANopen 多路传感器采集 + EtherCAT 高速执行机构联动,实时上传生产数据至上位机。
9.4 新能源设备控制器
CANopen 总线电池管理系统 BMS 数据采集,实时监控电压、电流、温度。
浙公网安备 33010602011771号