ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RK3588上跑CODESYS+EtherCAT:多轴运动控制实战指南

RK3588上跑CODESYS+EtherCAT:多轴运动控制实战指南 1. 为什么要在RK3588上跑CODESYSEtherCAT把CODESYS和EtherCAT搬到RK3588这块板子上是我这两年做运动控制项目时反复验证过的一条路线。RK3588这颗芯片8核4×A764×A55架构主频能到2.4GHz自带NPU和丰富的外设接口跑Linux系统做工业控制主站完全够用。而CODESYS作为IEC 61131-3标准的软PLC运行时配合EtherCAT总线能实现微秒级的同步周期驱动伺服、步进、IO模块做多轴联动。这套方案解决的核心问题是传统PLC方案成本高、扩展性差而纯软PLC方案又常常受限于硬件实时性。RK3588的多核性能加上Linux的实时补丁再叠上CODESYS的EtherCAT主站协议栈就能用一块不到千元的板子撑起原本需要上万块专用控制器才能做的多轴控制场景。适合谁来参考如果你是有一定Linux基础、做过PLC编程、想从传统方案往软PLC总线控制方向转的工程师这篇内容能帮你少走至少两周的弯路。如果你刚接触EtherCAT也没关系我会把配置逻辑和踩坑点都拆开讲。注意本文所有操作基于RK3588开发板望获LinuxRockchip官方Ubuntu衍生版环境CODESYS版本为V3.5 SP19EtherCAT主站使用CODESYS自带的EtherCAT Master SoftMotion。2. 环境准备与系统配置2.1 望获Linux的安装与基础配置望获Linux是Rockchip社区维护的Ubuntu镜像对RK3588的适配度比通用Ubuntu高很多。我试过直接刷Ubuntu 22.04官方镜像结果NPU驱动和VPU硬解都跑不起来后来换回望获Linux才一切正常。烧录步骤不复杂但有几个细节容易翻车下载望获Linux的RK3588镜像通常是.img格式用RKDevTool或balenaEtcher写入SD卡或eMMC。首次启动后默认用户名和密码通常是rock/rock或linaro/linaro具体看镜像版本。登录后第一件事是扩展根分区否则默认分区只有几GB装完CODESYS就满了。# 查看当前分区情况 df -h # 扩展根分区假设根分区在/dev/mmcblk0p6 sudo resize2fs /dev/mmcblk0p6扩展完分区后建议立刻更新软件源并安装基础工具sudo apt update sudo apt install -y build-essential git cmake python3-pip \ net-tools openssh-server vim htop提示望获Linux的软件源有时候会抽风如果apt update报错把/etc/apt/sources.list里的源换成清华或中科大的镜像速度会稳很多。2.2 实时内核补丁与CPU隔离CODESYS的EtherCAT主站对实时性有要求标准Linux内核的调度抖动可能在几百微秒而EtherCAT周期通常要跑到1ms甚至更短。所以必须打上PREEMPT_RT补丁或者至少做CPU隔离。我实测下来望获Linux自带的5.10内核已经带了部分实时特性但还不够。最稳妥的做法是把CPU核心0和1隔离出来专门给CODESYS运行时和EtherCAT任务用。在GRUB启动参数里加上isolcpus0,1 nohz_full0,1 rcu_nocbs0,1。修改/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTquiet splash isolcpus0,1 nohz_full0,1 rcu_nocbs0,1然后sudo update-grub并重启。重启后用cat /proc/cmdline确认参数生效。注意隔离CPU后普通进程不会自动跑到核心0和1上需要用taskset手动绑定。CODESYS运行时的进程要绑到隔离核上否则实时性提升不明显。2.3 网络接口配置与EtherCAT网卡选择RK3588开发板通常有两个千兆网口一个走原生GMAC一个走PCIe转接。EtherCAT主站必须用原生网口因为PCIe转接的网卡延迟抖动大容易丢帧。查看网口信息ip link show # 通常eth0是原生GMACeth1是PCIe转接把eth0配置成静态IP用于CODESYS和上位机通信sudo nmcli con mod eth0 ipv4.addresses 192.168.1.100/24 sudo nmcli con mod eth0 ipv4.gateway 192.168.1.1 sudo nmcli con mod eth0 ipv4.method manual sudo nmcli con up eth0EtherCAT从站通常接在eth1上但eth1如果是PCIe转接的建议换到原生网口。如果板子只有一个原生网口那就把EtherCAT从站和CODESYS通信都走同一个网口但要用VLAN隔离否则广播包会干扰EtherCAT通信。实操心得我一开始用PCIe转接的网口跑EtherCAT周期设1ms时偶尔会报Working Counter Mismatch换成原生网口后连续跑72小时没出过错。这个坑花了我整整一天才定位到。3. CODESYS安装与EtherCAT主站配置3.1 CODESYS Runtime在ARM64上的部署CODESYS官方提供的Linux ARM64运行时包下载后是一个.deb文件。安装前需要确认系统架构uname -m # 应该输出aarch64然后安装sudo dpkg -i codesyscontrol_linux_arm64_*.deb sudo apt install -f # 修复依赖安装完成后CODESYS运行时默认不会自动启动。需要手动启动并设置开机自启sudo systemctl enable codesyscontrol sudo systemctl start codesyscontrol sudo systemctl status codesyscontrol如果状态是active (running)说明运行时已经跑起来了。默认通信端口是1217用CODESYS IDE扫描设备时填这个端口。提示望获Linux的防火墙默认可能是开启的记得放行1217端口sudo ufw allow 1217/tcp sudo ufw allow 1217/udp3.2 CODESYS IDE端设备扫描与IP修改在Windows或Linux上位机上装好CODESYS IDE后新建项目设备树里右键Device选择Scan Devices。如果网络通应该能扫到RK3588上的运行时。扫到设备后双击设备在Communication Settings里可以看到当前IP。如果要改IP有两种方式在CODESYS IDE里直接改但需要运行时支持。在RK3588的Linux系统里改网口IP然后重新扫描。我习惯用第二种因为更直接。改完IP后在CODESYS IDE里重新扫描即可。注意CODESYS运行时的IP和Linux网口的IP是绑定的。如果你在Linux里改了eth0的IPCODESYS运行时会自动跟随不需要额外配置。3.3 EtherCAT主站添加与从站扫描在CODESYS IDE里右键Device选择Add Device在Fieldbuses分类下找到EtherCAT Master添加进去。然后右键EtherCAT Master选择Scan DevicesCODESYS会自动扫描总线上的从站。扫描前要确保EtherCAT从站已经上电并且和RK3588的EtherCAT网口物理连接。从站的ESIEtherCAT Slave Information文件已经导入CODESYS。汇川、倍福、台达的从站ESI文件通常可以在官网下载。扫描到从站后CODESYS会自动把从站添加到设备树并分配PDO映射。这时候需要检查每个从站的Process Data配置确保输入输出字节数和实际一致。实操心得汇川的伺服从站ESI文件有时候版本对不上扫描后PDO映射会错位。解决办法是手动导入对应固件版本的ESI文件或者在从站配置里手动调整PDO映射。我遇到过好几次最后养成习惯每次换从站型号先确认ESI版本。4. 多轴控制程序开发与调试4.1 轴配置与SoftMotion库调用CODESYS的SoftMotion库是跑多轴控制的核心。在设备树里添加SoftMotion库后就可以在程序里调用MC_Power、MC_MoveAbsolute、MC_MoveRelative等功能块。轴配置步骤在EtherCAT Master下右键从站选择Add SoftMotion Axis。在轴参数里设置Scaling把脉冲数换算成毫米或角度。设置Limit包括软限位、速度限制、加速度限制。一个典型的多轴联动程序结构PROGRAM PLC_PRG VAR axis1: AXIS_REF; axis2: AXIS_REF; power1: MC_Power; power2: MC_Power; move1: MC_MoveAbsolute; move2: MC_MoveAbsolute; END_VAR power1(Axis:axis1, Enable:TRUE); power2(Axis:axis2, Enable:TRUE); move1(Axis:axis1, Execute:TRUE, Position:100.0, Velocity:50.0); move2(Axis:axis2, Execute:TRUE, Position:200.0, Velocity:50.0);注意MC_Power的Enable必须保持TRUE否则轴会掉使能。多轴联动时建议用MC_SyncMoveAbsolute或MC_CamIn做同步普通MC_MoveAbsolute各轴独立执行同步精度不够。4.2 EtherCAT周期与DC同步配置EtherCAT的分布式时钟DC同步是多轴控制精度的关键。在EtherCAT Master的General选项卡里设置Cycle Time通常1ms起步要求高的可以设500us甚至250us。DC同步配置在EtherCAT Master的Distributed Clocks里勾选Enable Distributed Clocks。设置Sync Unit Cycle通常和Cycle Time一致。从站的DC模式选择DC Synchronous不要选Free Run。实操心得DC同步没配好的话多轴联动时会出现轴间位置偏差而且偏差会累积。我一开始没开DC两个轴跑圆弧插补跑10圈后偏差到了2mm。开了DC后偏差稳定在0.01mm以内。4.3 实际调试中的参数整定伺服参数整定是绕不过去的。汇川伺服的位置环增益、速度环增益、速度环积分时间这三个参数直接决定轴的响应速度和稳定性。我的整定顺序先把速度环增益调到默认值的一半速度环积分时间设大一点比如100ms。逐步增大速度环增益直到电机开始啸叫然后回调20%。减小速度环积分时间直到位置偏差收敛速度满足要求。最后调位置环增益通常从10开始逐步加到50左右。注意整定过程中一定要把软限位设好否则电机可能飞车。我第一次整定时没设限位电机直接撞到机械限位把联轴器都撞松了。5. 常见问题与排查技巧实录5.1 EtherCAT通信故障速查表故障现象可能原因排查方法解决方案扫描不到从站网线没插好/网口选错ip link看网口状态换原生网口检查网线Working Counter Mismatch周期太短/网卡延迟大看CODESYS日志增大周期换原生网口从站掉线DC同步没开/ESI版本不对看从站LED状态开DC导入正确ESI轴不动使能没给/限位触发看MC_Power状态检查使能和限位位置偏差大增益没整定好/DC没开看轴的实际位置曲线整定增益开DC5.2 独家避坑技巧网口选择RK3588的PCIe转接网口跑EtherCAT周期低于2ms就容易丢帧。原生GMAC网口可以稳跑1ms。CPU隔离不隔离CPU的话CODESYS运行时的调度抖动可能到500us以上。隔离后能降到50us以内。ESI文件汇川伺服的ESI文件版本很多一定要用和固件版本匹配的。版本不对的话PDO映射会错位轴会报Invalid PDO Mapping。DC同步多轴联动必须开DC否则轴间同步精度不够。单轴控制可以不开但开了更好。看门狗CODESYS运行时有看门狗如果程序卡死运行时会重启。调试阶段可以把看门狗时间设长一点避免频繁重启。提示如果CODESYS运行时频繁重启先看/var/log/codesyscontrol.log里面会有详细的错误信息。常见的是Segmentation Fault通常是库版本不兼容导致的。5.3 性能优化建议把CODESYS运行时进程绑到隔离核上taskset -cp 0 $(pidof codesyscontrol)。关闭不需要的系统服务减少CPU占用sudo systemctl disable bluetooth等。用htop监控CPU占用确保隔离核的占用率低于50%。EtherCAT周期不要设得太短1ms足够大多数多轴控制场景。设250us的话CPU占用会飙升。我在实际项目中用这套配置跑过4轴联动周期1ms连续运行72小时无故障。CPU占用率在30%左右隔离核占用率在15%左右。这个性能对于大多数工业场景已经够用了。最后再分享一个小技巧如果CODESYS IDE扫描不到RK3588上的运行时先检查RK3588的防火墙和SELinux状态。望获Linux默认可能开了SELinux把它设成permissive模式能省掉很多莫名其妙的连接问题。
返回列表