ARTICLE DETAIL

资讯详情

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

CODESYS软PLC+EtherCAT驱动步进电机:单轴运动控制从选型到调试全解析

CODESYS软PLC+EtherCAT驱动步进电机:单轴运动控制从选型到调试全解析 最近帮朋友收拾了一条上料线的送料机构单轴任务说简单也简单按设定位置走位、速度可调、能远程启停、以后还要能扩成双轴。选型时在传统PLC、CODESYS软PLC和单片机方案之间犹豫了半天最后落地的是CODESYS加EtherCAT加步进电机的组合。整套系统从选型到调试花了一周多把关键决策、接线细节、程序写法和几个典型坑都记在下面给正在琢磨类似项目的朋友做个参考。如果你也打算用CODESYS做运动控制、用EtherCAT挂总线驱动器或者单纯想看看步进电机单轴控制能玩出什么花这篇应该能省你不少时间。1. 方案选型为什么是CODESYS和EtherCAT的组合1.1 控制器层面的选型逻辑先回答一个最基础的问题为什么不用传统一体式PLC而选了CODESYS单轴控制听起来很简单传统PLC用高速脉冲口加一个步进驱动器也能跑确实能跑。但这类方案的问题在于第一运动控制指令往往集成度不高加减速曲线、回零逻辑、软限位全要自己拼第二PLC品牌绑定了编程软件后续想换硬件就得重新学一套第三一旦要扩展第二轴、第三轴脉冲口不够用是小事轴间同步、插补这类需求在传统小型PLC上基本实现起来特别别扭。CODESYS解决的是生态和部署的问题。它是IEC 61131-3标准的软PLC开发环境可以运行在Windows、Linux、树莓派、各种ARM主板上代码和工程文件跨硬件平台复用。运动控制方面有现成的库SM3系列点动、回零、绝对定位、速度控制都是封装好的功能块不用自己写加减速算法。最实在的一点是工程里可以先用虚拟PLC把逻辑调通再下载到实际控制器上省掉折腾硬件的时间。至于成本软件本身免费运行时按控制器授权算对单轴这种小项目压力很小。如果你手上正好有一块跑Linux的ARM开发板比如正点原子RK3568这类带千兆网口的板子完全可以当成CODESYS软PLC来用。这也解释了为什么现在很多小设备用RK3568跑IGH主站跑EtherCAT但核心逻辑和可视化仍然用比较原始的方式写。换成CODESYS之后运动控制部分直接从库里面调省事得多。1.2 总线层面的选型逻辑控制器选完了接下来是控制器和驱动器之间怎么通信。单轴步进电机最传统的连法是PLC发脉冲驱动器接收脉冲加方向信号。这种方案的优点是简单、延迟低但缺点也很明显脉冲频率上限限制了最高速度长距离传输时脉冲容易被干扰驱动器状态信息电流、报警、位置反馈基本传不回来。更关键的以后轴多了之后每个轴的脉冲口、方向口、报警输入都要占用PLC的点位接线数量成倍增加。EtherCAT在现场总线里算是目前运动控制领域的主流选择。它的本质是实时工业以太网主站通过一根网线串联所有从站数据在网上“飞过”每个从站时从站硬件直接抽取属于自己的数据、填入自己的数据处理完再交给下一个。这种“飞过”式传输机制带来两个直接好处一是极低的同步抖动多轴场景下轴间同步精度可以做到微秒级二是拓扑灵活一根线串到底布线非常方便。单轴场景下EtherCAT好像有点“杀鸡用牛刀”但我比较看重它后面的扩展性。第一版只挂一台步进驱动器第二版想加一台伺服直接再串一台设备、加一个轴对象就行不用重新设计控制柜。另外总线上可以实时读到驱动器的实际电流、实际位置、报警码这些数据对调试和远程维护来说太宝贵了脉冲方案完全做不到这一点。1.3 电机与驱动器选型步进电机的核心原理是把电脉冲信号转换为角位移每收到一个脉冲转子就转过一个固定角度所以叫“步进”。它的优势是开环控制下也能精确定位结构简单、成本低、可靠性高非常适合负载不大、速度不高的定位场景。项目里用的是最常见的42步进电机两相四线配合丝杠去推料。驱动器选的是带EtherCAT从站接口的步进驱动器型号上类似雷赛DM3E这种总线型产品。选它而不是普通脉冲型驱动器原因很简单普通驱动器没有EtherCAT从站接口没法直接上总线而总线型驱动器自带CiA402协议支持CODESYS侧可以直接映射控制字、状态字、目标位置、实际位置这些对象运动控制指令下发之后驱动器内部再去驱动电机省掉中间脉冲的转换环节。选型时要注意电机的扭矩余量。步进电机的特性是转速越高扭矩越小实际负载扭矩最好控制在电机额定扭矩的50%以下否则高速丢步会让人崩溃。42步进电机的保持扭矩一般在0.4到0.6 N·m配合导程5mm左右的丝杠推几十公斤以下的小型机构基本够用。如果负载偏大建议直接升级到57步进或者换闭环步进别在高频丢步这件事上赌运气。2. 硬件搭建从控制板到电机接线2.1 控制器平台的关键选择控制器用的是RK3568开发板加CODESYS Runtime。这里有一个非常关键的硬件门槛EtherCAT主站需要支持实时以太网驱动而且不是所有网卡都支持。CODESYS官方对网卡芯片有兼容性列表我自己碰过的经验是Intel I210、I211、I225这类网卡表现都很稳板载Realtek网卡在Windows下经常出现扫描不到从站或者通信抖动的问题。选板卡时一定要确认网卡芯片否则后面调试会非常痛苦。裸板拿到手第一步工作是装系统、装运行时。RK3568跑LinuxCODESYS官方提供对应的CODESYS Control for Linux ARM运行时包按文档装上即可。需要留意的是有些板卡预装的是IGH主站环境而不是CODESYS Runtime两者是不同的方向。IGH是开源EtherCAT主站适合用C语言开发自己的主站程序CODESYS则是把整个PLC运行时和EtherCAT主站集成好了编程侧用IEC语言更适合快速做设备。IP地址设置是很容易被忽略的坑。CODESYS连目标设备需要通过网关而网关和设备必须能互相访问。现场我遇到过好几次板卡默认IP和上位机不在一个网段网关一直找不到设备的尴尬情况。后来学乖了拿到板卡先把IP固定到一个统一网段比如192.168.1.x然后在CODESYS里通过网关添加目标设备时直接把这个IP填进去一次就能连上。如果你发现连不上先用Windows的ping命令测一下通不通通常能定位出是IP问题还是网关问题。2.2 EtherCAT网线与网络拓扑EtherCAT传输走标准RJ45网线和超五类以上网线这点比很多专用总线友好但“能用”和“稳定用”是两回事。项目现场如果靠近变频器、电机这种强干扰源强烈建议用带屏蔽层的工业以太网线金属RJ45头更好。屏蔽层必须可靠接地否则屏蔽层会变成天线反而引入干扰。线序上EtherCAT主站到从站之间是标准的以太网交叉直连无所谓反正现在的网卡和从站都支持自动翻转但建议全链路保持一致方便排查线路问题。拓扑方面EtherCAT是一根线串到底的菊花链结构主站出来接第一台驱动器驱动器再接下一台设备依次往后。需要注意的是最后一个从站的空闲网口不需要接终端电阻这和CAN总线不一样但最好用防尘帽堵上防止灰尘进入导致触点氧化。当时现场工程师就问我“要不要像CAN那样加个120欧姆电阻”答案是EtherCAT不用但每个网口的屏蔽层接地处理要做好。供电方面EtherCAT从站一般由驱动器自身电源供电不需要通过网线供电所以网线只走通信信号。这也意味着只要给驱动器供上电从站通信就可以工作即使电机没转总线也能正常连上。调试顺序上我习惯先把所有从站供电再给主站上电这样主站扫描从站时能一次性扫全避免漏站。2.3 步进驱动器的使能、供电和电机线步进驱动器看起来简单真接错的时候也够呛。驱动器供电一般是直流24到50V根据电机型号匹配电压和电流设置面板上有拨码或数码管按电机额定电流设置即可。42步进电机额定电流一般在1.0到1.5A左右别把电流调太高不然电机发烫你晚上都睡不着。关于使能信号这里必须专门提醒一下。很多步进驱动器上有ENA和ENA-两个端子控制驱动器输出是否给电机通电。问题在于不同品牌的使能逻辑是相反的有的驱动器ENA接高电平表示“使能”电机锁轴有的却是接高电平表示“禁止”悬空或接低电平才允许电机运动。我第一次用某品牌驱动器时按惯性思维把ENA接5V想让它使能结果上电之后电机完全锁死所有定位指令都不动查了好久才发现这个逻辑是反的。所以到手的驱动器第一件事就是翻手册看使能逻辑然后拿万用表量一下输入端的电压再做接线。电机侧接线相对固定两相四线就是A、A-、B、B-四根线分别接驱动器对应端子。如果把A相接成B相电机只会嗡嗡响着抖动不转接反其中一组极性电机会反转。这个通过调换任意一组的两根线就能改方向不用改程序。另一个细节是电机的电源线尽量和EtherCAT网线分槽走避免电机线里的电流突变干扰总线通信。安装板上的孔位也要避开驱动器散热器否则长时间运行后温度上来了驱动器容易过温报警。3. 软件配置让EtherCAT从站快速上线3.1 CODESYS开发环境与目标连接软件层面我用的是CODESYS V3.5 SP19版本新一点的SP版本都可以。开发环境安装好之后新建工程时选择对应的控制器型号模板如果用的是RK3568就找CODESYS Control for Linux ARM相关的目标文件。工程建好后第一件事不是写程序而是先把“设备和网络”里的连接做好。连接步骤很简单但有几个分支容易卡住。首先通过菜单“工具-网关”添加网关把网关指向控制器的IP地址。然后右键设备树里的“PLC”选择更新设备或者添加设备时找到对应的运行时版本。如果设备树里出现一个红色的感叹号多半是运行时版本不匹配或者网段不通。这里分享一个定位技巧CODESYS底部有一个“消息”窗口它给出的错误提示往往比你想的准确比如“设备无响应”“版本不匹配”“用户名错误”之类的先看提示再排查别一上来就重装系统。连接好之后下载空工程跑一下确认PLC运行状态变成绿色。这一步花不了几分钟但能确保后面的EtherCAT从站扫描是在一个健康的运行环境里进行的。我当时因为板卡IP和网关不在一个网段卡了快两个小时最终是ping不通才发现的问题后期每次接新设备都先ping一下血泪教训。3.2 安装ESI与扫描从站EtherCAT从站能不能被正确识别取决于主站是否认识这个从站的设备描述。从站设备描述文件叫ESIEtherCAT Slave Information一般由驱动器厂商提供文件后缀是.xml或.esi官网基本都能下载到。下载后放到CODESYS安装目录下对应的EtherCAT设备描述库文件夹里或者在“设备描述编辑器”里安装。如果从站扫描出来显示的是“Unknown Device”或者“无法识别的设备”第一个反应就应该是ESI没装对。要注意的是安装ESI之后CODESYS有时候不会自动刷新需要把当前打开的工程关掉重开或者直接重启IDE否则扫出来的还是缓存里的Unknown状态。另一个常见问题是从站固件版本和ESI版本不一致扫描结果会提示版本错误这时候到官网找最新版的ESI重新装一遍基本都能解决。扫描操作本身非常简单右键设备树里的EtherCAT主站选择“扫描设备”然后描网络里所有EtherCAT从站。扫描完成后把从站添加到工程中系统会自动分配站地址。我的习惯是手动给每个从站指定一个固定站地址比如把唯一的驱动器设为“1”然后保存到从站EEPROM里。这样即使以后换主站、重新扫描站地址也不会漂移配置文件也能对得上。3.3 PDO映射、FMMU与单位换算从站添加进来之后核心工作是配置过程数据对象PDO。CiA402协议下驱动器通常会提供一组默认PDO映射包含控制字、状态字、目标位置、实际位置这几个基本对象。以CSP循环同步位置模式为例典型的PDO映射大概长这样对象索引名称长度方向0x6040控制字 Controlword2字节主站到从站0x6041状态字 Statusword2字节从站到主站0x607A目标位置 Target Position4字节主站到从站0x6064实际位置 Actual Position4字节从站到主站0x60FF目标速度 Target Velocity4字节主站到从站0x606C实际速度 Actual Velocity4字节从站到主站PDO映射背后的底层机制是FMMUFieldbus Memory Management Unit。主站会把每一次EtherCAT报文里不同的逻辑地址段分配给不同的从站每个从站通过FMMU把属于自己的报文片段映射到本地对象字典。整体上这个过程由主站自动完成用户一般不需要手动干预但理解它有一个很实际的好处当你遇到“从站掉电重连后位置数据错乱”这类问题时大概率是FMMU映射被重新分配后主站和从站对数据位置的理解不一致了。所以每次修改完PDO配置都建议把整个工程配置导出备份换从站、换主站时用同一个配置文件恢复能少踩很多坑。单位换算是单轴控制里最容易算错的地方。以我的项目为例驱动器细分设为3200脉冲/转也就是电机每转一圈需要3200个位置单位丝杠导程5mm电机转一圈丝杠螺母走5mm。如果想让CODESYS里的位置单位是毫米那么每毫米对应3200除以5等于640个位置单位也就是位置分辨率是1/640毫米。在CODESYS的轴配置里把这个比例关系填进去后续程序里直接写“移动10.0”就是10毫米不用自己做除法。建议把细分、导程、电子齿轮比这几个数值在配置界面旁边的备注里写清楚不然半年后你自己回来看工程都记不清当初怎么算的。4. 运动控制程序单轴控制的完整实现4.1 运动控制库与轴对象CODESYS的运动控制库有很多单轴控制我用的最多的是SM3_Basic库它提供了基础的MC_Power、MC_Home、MC_MoveAbsolute、MC_MoveVelocity这些功能块简单直接。如果你以后想做插补和CNC会用到SM3_CNC这些更高级的库但单轴定位用Basic就够了。使用库之前需要在工程里添加一个轴对象。双击设备树里的“Application”添加新的轴对象选择“AXIS_REF”这一类型。轴对象本身只是一个数据结构保存轴的当前位置、速度、状态、参数等信息。真正的物理-逻辑映射要靠配置输入在轴对象的设置里指定它对应哪个EtherCAT从站的哪个CiA402对象。CODESYS在添加EtherCAT从站时会自动识别出这是一个支持CiA402的驱动设备然后提供选项让轴对象绑定到这个从站上。绑定成功之后程序里操作轴对象实际上就是在操作EtherCAT总线上的目标驱动器。轴参数配置里有两个地方必须仔细一是位置比例关系也就是电子齿轮比对应刚才说的脉冲数和位置单位换算二是动态限制包括最大速度、最大加速度、最大加加速度。这些限制是保护性的程序里即使写了超限值运行时会自动钳制到设定范围内。我的习惯是把最大速度设为实际需求速度的1.5倍最大加速度设为程序常用加速度的2倍既给自己后面优化留余量又防止误操作把轴弹出安全问题。4.2 使能、回零、定位与点动的指令链条单轴控制的程序逻辑可以归纳成一条指令链条先使能再回零然后根据需求做定位、点动或者速度运行最后停止和复位。第1步是MC_Power使能它有两个重要输入Enable是控制轴的是否上电bRegulatorOn控制调节器是否打开bDriveStart控制驱动器是否启动。对步进驱动器来说bDriveStart一般也要给TRUE不然有些驱动器不会真正进入使能状态。千万不要以为MC_Power的Enable给TRUE之后轴就一定能动驱动器侧的使能信号ENA引脚和软件使能是两回事两个都要满足。第2步是回零。开环步进电机没有编码器断电后位置信息会丢失所以每次上电都必须先确定零点。最简单的做法是把当前机械位置当零点通过MC_Home功能块把轴当前位置清零。更规范的做法是接一个原点开关回零时轴先向原点方向移动碰到开关后停下来把这个点设为位置零点。如果你的设备有硬限位回零过程中还能用限位信号自动停止。单轴设备上我强烈建议把原点开关加上否则每次断电重启后都得人工对刀太费事。第3步是定位和点动。绝对定位用MC_MoveAbsolute它直接把目标位置、运行速度、加速度、减速度和加加速度作为输入执行后轴的内部运动规划会自动生成梯形或S形速度曲线。点动操作用MC_MoveVelocity它给一个速度值轴就一直以这个速度运动直到收到MC_Stop停止指令。这里有个细节MC_MoveAbsolute是“边沿触发”Execute输入只在FALSE变TRUE的那一下生效如果PLS保持TRUE再把位置改大它不会自动追踪新目标。想连续追踪目标位置的话要在每次目标变化时把Execute拉低再拉高一次。4.3 程序框架与代码解读整个控制程序我习惯分成三个PRG主程序PLC_PRG负责状态机轴控制程序AxCtrl负责调用运动控制功能块面板交互程序Hmi负责处理按钮和显示。下面是轴控制部分的核心代码去掉手轮和报警分支后逻辑其实很短VAR stAxis1 : AXIS_REF; bPower : BOOL : TRUE; bHome : BOOL; bMoveAbs : BOOL; fTargetPos : LREAL : 100.0; fVelocity : LREAL : 50.0; fActPos : LREAL; bInPos : BOOL; eAxisState : MC_AxisState; END_VAR // 轴使能 MC_Power_0( Enable : TRUE, bRegulatorOn : TRUE, bDriveStart : TRUE, Axis : stAxis1, Status , Error , ErrorID ); // 回零 MC_Home_0( Execute : bHome, Position : 0.0, Axis : stAxis1, Done bHomeDone, Busy , CommandAborted , Error , ErrorID ); // 绝对定位 MC_MoveAbsolute_0( Execute : bMoveAbs, Position : fTargetPos, Velocity : fVelocity, Acceleration : 100.0, Deceleration : 100.0, Jerk : 500.0, Axis : stAxis1, Done bInPos, Busy , CommandAborted , Error , ErrorID ); // 读取实际位置和轴状态 MC_ReadActualPosition_0( Axis : stAxis1, Value fActPos); MC_ReadStatus_0( Axis : stAxis1, Status eAxisState);执行逻辑的顺序是程序一运行就把MC_Power的Enable保持TRUE轴进入使能状态。用户按一下“回零”按钮bHome产生一个上升沿轴回零Done之后bHomeDone变TRUE。等回零完成面板上的“启动”按钮才允许点击bMoveAbs上升沿触发一次绝对定位目标位置是100mm速度50mm/s加速度和减速度都是100mm/s²。fActPos和eAxisState会持续刷新上位机界面用这两个变量显示当前位置和轴状态。从这段代码里你可以看到CODESYS把很多底层细节都封装掉了自己在梯形曲线规划和位置闭环计算上写过的那些代码在库函数里基本都已经是成熟实现。这也是我推荐CODESYS做单轴控制的原因之一稳定性有保障出Bug的概率比从零写一套运动控制小得多。5. 调试排障那些踩过的坑和解决办法5.1 EtherCAT通信层面的坑通信类的坑排在第一位因为这种问题往往会让整个系统“瘫痪”。最常见的是扫描不到从站原因无非四类从站没供电、网线坏了或接触不良、网卡实时驱动没装好、ESI没装。排查顺序建议是先看从站指示灯绝大多数EtherCAT从站都有RUN/ERR指示灯再换一根网线再到CODESYS的日志里查实时通信的初始化信息最后补装ESI。千万不要一上来就怀疑主站配置。第二个典型问题是运行过程中偶发断链。这种情况在现场强干扰环境下特别容易发生。曾有一次我调试时轴跑到一半就报EtherCAT断站查了半天发现是电机电源线和网线走了同一个线槽电机启动瞬间的电流变化干扰到了总线信号。把网线换成屏蔽线、重新布线分开敷设之后问题就消失了。另外从站的供电电源也要尽量用稳压电源如果电源纹波太大从站芯片会偶发复位表现出来就是总线经常掉站。第三个问题是配置恢复后数据错位。有一次现场设备维修后重新上电主轴能启动但定位位置全乱了检查一圈发现是EtherCAT从站掉电重启后主站重新扫描并分配了FMMU映射而上位机程序还在用旧逻辑地址读位置。这种问题防起来很简单一是把从站站地址固定并保存到EEPROM二是整个配置工程文件务必留档恢复系统时用同一份配置重新下载。5.2 电机运行层面的坑电机层面的问题比通信问题更“直观”出问题时往往是很明显的物理现象。第一个坑是使能逻辑。开篇讲过ENA接反导致电机锁死这个问题在调试现场很容易被误判为程序没写好。排查办法是MC_Power里使能后用手去转电机轴如果感觉有阻力、转不动说明硬件使能没有问题问题多半在运动指令如果电机轴仍然可以随便转那就得检查硬件使能逻辑和bDriveStart。第二个坑是低速抖动。步进电机在某个低速区间会表现出明显的共振比如42步进电机在200到300转/分之间抖动特别明显。如果你的送料机构在这个区间运行整个机架都会跟着抖。解决思路有几条换更高的细分让脉冲更细腻调整驱动器电流在程序里避开共振速度区间比如运行速度从低速直接跳到中速或者用S形加减速曲线提高Jerk值让速度平滑过渡。我实际测试下来把驱动器细分从1600提高到3200低速抖动明显改善。第三个坑是丢步。开环步进的痛点就在这里丢步之后电机不会主动报错系统还以为自己在正常运动位置偏差就这么悄无声息地累积起来了。最典型的原因是加减速太猛步进电机在高速区的扭矩已经下降加速度再大直接突破转矩极限立刻丢步。解决办法是降低加速度、预留扭矩余量或者干脆上闭环步进。如果你的场景对位置准确性要求很高或者负载会变动我建议预算允许就直接上带编码器的闭环步进丢步时驱动器会自动修正程序里几乎不用改。5.3 常见问题速查表把这段时间踩过的、以及同事们常问的问题整理成一张速查表方便你现场对照排查现象可能原因排查方向扫描不到从站从站未供电、网线损坏、实时网卡驱动未装、ESI缺失看从站指示灯换网线查看CODESYS日志补装ESIPLC连不上控制器IP不在同一网段网关配置错误ping通目标IP修改IP在网关中重新添加设备轴使能后电机仍可转动硬件使能逻辑接反bDriveStart未置TRUE驱动器使能脚未使能查驱动器ENA文档用万用表量ENA电压检查MC_Power参数轴锁死不运动ENA接成禁止状态软件使能被禁止驱动器报警检查ENA电平逻辑看驱动器数码管报警码定位位置偏差电子齿轮比算错丝杠导程/细分设置错误丢步核对轴参数比例关系测量实际位移降低加速度低速电机抖动共振速度区间细分过低电流不稳提高细分调整驱动器电流避开特定速度区间运行中掉站网线干扰、从站供电纹波大、网口接触不良换屏蔽网线分槽走线加稳压电源紧固网口重新上电后位置错乱从站站地址漂移FMMU映射重新分配配置未保存固定站地址导出备份配置重新下载工程5.4 后续扩展的一点建议我的这个项目第一版只挂了单轴但给后面留了升级路径。EtherCAT总线上再加一台从站CODESYS里再添加一个轴对象程序逻辑基本不用动就能扩成双轴。如果想继续增强性能可以把步进电机换成带编码器的闭环步进或者直接上伺服程序里改一下轴参数和PDO映射就行。因为总线和控制器的能力上限远高于目前需求扩展的边际成本很低这也是我个人非常推荐总线型运动控制的原因。调试阶段还有一个非常有效的工具就是曲线分析。CODESYS自带的Trace功能可以记录变量的变化曲线我通常会把实际位置、设定速度、驱动器状态字拉出来看定位问题非常直观。如果你在外面调试不想反复传程序也可以用第三方工具读取CODESYS运行时的变量比如PLC-Recorder这类软件直接在线记录实际位置和速度曲线加减速参数合不合适一眼就能看出来比盯着数码管猜强太多。最后再说一个小心得单轴项目虽然小但现场稳定性和后续维护同样重要。工程文件里把轴参数、电子齿轮比、接线定义、从站配置这些信息都写清楚哪怕是写在注释里几个月后回来看工程都会感谢当时的自己。这次项目整个过程不算复杂但麻雀虽小五脏俱全从方案选型到接线配置再到程序调试每一步都有值得琢磨的细节。祝各位上电一次成功少踩几个和我当年一样的大坑。
返回列表