ARTICLE DETAIL

资讯详情

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

CODESYS与EtherCAT控制的步进电机单轴运动实践

CODESYS与EtherCAT控制的步进电机单轴运动实践 去年帮朋友调一台小设备主控想用CODESYS现场总线选了EtherCAT末端是一个42步进电机带丝杆滑台。任务不复杂单轴点位运动但要跑得稳、定位准、能回零、出问题时能快速排查。折腾了几天把整个链路从组态配置、单位换算、运动指令到现场联调走了一遍踩了不少坑也攒了不少心得。这篇就拿这个项目当例子把基于CODESYS与EtherCAT的步进电机单轴控制实践从头到尾拆开讲适合正在入门CODESYS运动控制、被EtherCAT组态搞晕、或者准备把脉冲步进改成总线步进的朋友参考。CODESYS这几年在自动化圈子里普及速度很快IEC 61131-3全系列编程语言、SoftMotion运动控制库、以及原生集成的EtherCAT主站让它在软PLC和硬件PLC两个方向都占了不少份额。EtherCAT作为工业以太网总线它的“飞读飞写”机制和分布式时钟让多轴同步和高速点位控制在技术上变得非常舒服。搭配步进电机这套组合几乎是中小型单机设备的标准答案之一。下面直接进入实操把整个项目从方案到调试完整过一遍。1. 方案选型与系统架构1.1 为什么选CODESYS加EtherCAT来控步进电机先回答一个问题单轴步进用老办法PLC发脉冲不也一样能做吗确实能做而且很多设备至今还在用脉冲方式。但用EtherCAT总线去控步进驱动器有两个非常实际的收益。第一是接线大幅简化脉冲、方向、使能三根信号线变成一根网线整个电柜里少了一堆接线端子调试时查线的工作量直线下降。第二是反馈回来得更多总线驱动器能把实际位置、电流、报警码这些状态实时传给PLC开环步进也能有“半闭环”的监控体验排查问题的时候特别有用。CODESYS这边它的优势在于把逻辑控制、运动控制和总线组态放在同一个工程里。你不需要像传统方案那样PLC逻辑一套软件、伺服调试一套软件、总线组态又一套软件折腾三个工具链。CODESYS里一个工程文件把EtherCAT主站挂上去、扫描出驱动器、拖几个MC功能块逻辑和运动就写在一起了。对于个人学习和中小设备开发来说这种一体化体验非常省心。从成本角度说步进电机本身便宜42、57规格的电机几十到一百多块钱就能买到不错的带EtherCAT接口的步进驱动器虽然比普通脉冲驱动器贵一些但相比伺服驱动还是低一个数量级。再加上步进在低速大扭矩场景下的表现并不差很多点对点定位、轻载搬运、简单送料机构用这套组合在性价比上是很合适的。这也是我推荐从单轴步进入手学CODESYS运动控制的原因——它能把通信配置、驱动器参数、运动指令、单位换算这些核心概念都过一遍但又不至于像多轴伺服联动那样一上来就信息过载。为了让你直观看到总线方案和传统脉冲方案的差异我做了个对比表对比项传统脉冲方向控制CODESYSEtherCAT总线控制接线脉冲方向使能每轴至少3根信号线一根网线串联或星型状态监控基本无或靠驱动器IO输出实时位置、电流、报警全在总线上参数配置驱动器拨码/软件单独设总线中直接读写下参数部分参数在线改抗干扰能力脉冲线长距离易受干扰数字以太网抗干扰强调试效率查线、量信号耗时扫描设备、看状态字定位成本低驱动器略贵综合接线成本未必高1.2 这套系统的硬件选型清单主站这边CODESYS运行环境可以跑在工控机上做成软PLC也可以选原生CODESYS的硬件PLC。工控机方案灵活性能强适合前期学习和调试但工业现场长期跑建议还是用正规的工业PC或硬件PLC稳定性更靠谱。汇川、欧姆龙、博世力士乐这些品牌的部分PLC本身就是CODESYS内核如果你手头有这类PLC开发环境和普通CODESYS一致工程可以直接复用。主站方案里还有一种路线是在嵌入式平台比如带网口的开发板上部署CODESYS运行环境正点原子的RK3568开发板这类硬件也有人拿来做EtherCAT主站实验从学习和评估的角度看是可行的但从站驱动和实时补丁这类底层优化需要自己处理不少东西工业项目里要谨慎评估后再上。从站这边核心器件是带EtherCAT接口的步进驱动器。市面上这类驱动器已经很多了雷赛的DM3E系列是比较典型的代表它支持CoE协议也就是CANopen over EtherCAT内置CiA 402驱动行规位置、速度、回零这些功能都封装成了标准对象CODESYS通过标准PDO映射就能控制。我用过的DM3E是带编码器闭环版本的步进驱动器虽然本质还是步进电机但加了编码器反馈后低速平稳性和丢步检测能力比纯开环好很多调试时很有帮助。如果你手头是普通脉冲驱动器也有过渡办法加一个带EtherCAT从站接口的IO模块或协议转换模块把总线发的脉冲信号转成物理脉冲输出给驱动器。不过这种方案里总线反馈的位置只有指令位置没有实际位置调试体验会差一些。电机本体这个项目用的是大家最熟悉的42步进电机。42指的是机座边长42mm步距角1.8°也就是每圈200个整步。两相四线或两相六线都有接线时看清相序就行。很多入门教程喜欢用42电机因为它便宜、体积小、桌面实验方便带个轻载丝杆或同步带完全够用。再往上有57、86规格扭矩更大控制原理完全一样只是驱动器电流参数要相应调高。配套电源上步进驱动器的供电建议用24V开关电源功率按电机和驱动器的需求留余量。42步进通常额定电流在1.0到2.0A之间24V下功率不大选个5A以上的电源很稳。重点是电机电源和PLC逻辑电源最好分开供电或者在驱动器电源入口做好滤波免得电机启停时把逻辑电拉出毛刺这个问题对步进系统来说出现频率其实挺高后面会细说。1.3 EtherCAT通信机制和CoE/CiA 402的底层认知直接上手配置之前有必要把EtherCAT的工作原理过一遍不然出了问题根本不知道从哪里排查。EtherCAT本质上是一个主从轮询网络主站CODESYS这边周期性地发送以太网帧这些帧会依次经过每一个从站从站在帧经过的瞬间不是在软件层面而是由硬件EtherCAT从站控制器也就是ESC芯片直接从帧里取出分配给自己的数据同时把自己的数据插入到帧的对应位置这个机制在业内有个形象的叫法——“飞读飞写”。因为处理过程是硬件做的所以每个从站引入的延时只有纳秒到微秒级别整条链路的实时性非常好。这一帧里到底哪些数据给哪个从站、数据放在帧的什么位置就是由前文提到的FMMUFieldbus Memory Management Unit完成的从站能存多少过程数据、映射关系怎么配很多工程师在调试时看FMMU觉得抽象其实不用太深究原理只要知道CODESYS在扫描从站和配置PDO映射时会自动帮你把FMMU的设置写进从站就行。每帧数据发完主站会检查一个叫WKCWorking Counter工作计数器的值所有从站都对它做加计数主站据此判断帧是否完整经过所有从站、每个从站是否都正确响应了。如果WKC不对通信就会报错这也是EtherCAT最常用的通信健康度指标之一。总线通信之上步进驱动器用的协议是CoE。可以理解成把CANopen那套对象字典Object Dictionary搬到了EtherCAT上每个参数都有一个16位索引和8位子索引比如控制字是0x6040、状态字是0x6041、目标位置是0x607A这些对象可以通过邮箱通信类似CANopen的SDO来配置也可以通过过程数据对象PDO在每个通信周期里周期性交换。PDO就是实际运动控制中每个周期都要更新的数据比如你给驱动器发目标位置、控制字驱动器回传实际位置、状态字这些都是PDO。从站要在周期模式下运行需要先进入OPOperational状态这之前会经历INIT初始化、PREOP预运行邮箱通信可用、SAFEOP安全运行PDO有输出但还没生效几个阶段。驱动器内部还有一层CiA 402状态机这是电机驱动器的标准状态流转从Disabled禁用、Ready就绪、Switched On已上电到Operation Enabled运行使能。CODESYS里的MC_Power功能块使能轴时本质就是在图形化地帮你走这层状态机所以很多时候你看到轴在CODESYS里报错根因在驱动器状态机根本没走到合适的位置。理解了这层就不会被那些莫名其妙的“使能失败”搞懵了。2. 环境搭建与EtherCAT组态配置2.1 CODESYS开发环境准备CODESYS开发环境是免费的直接去官网下载Development System就行。注意版本V3.5是主力后面还可能带SP补丁包版本号比如SP17、SP19之类不同SP包对硬件和库的支持有差异安装时尽量选较新的稳定版。安装完成后你还需要确认SoftMotion这个运动控制软件包是否可用在CODESYS里SoftMotion负责提供MC_Power、MC_MoveAbsolute这类运动控制功能块通常和EtherCAT主站是配合使用的。如果是学习评估官方试用授权够用商用项目就得买正式授权这个提前和供应商确认好免得程序写到一半功能被锁。安装环境时有几个容易被忽略的细节。第一安装路径不要带中文老版本对中文路径支持不好各种莫名奇妙的问题都可能是这个引起的。第二Windows防火墙可能拦截CODESYS的通信端口尤其是你用网关连接本地或远程PLC时端口不通最典型的现象是“扫描不到设备”或“Online 时网关错误”我在调试时经常先关掉防火墙排除这个问题记得要在安全可控的环境里操作。第三CODESYS支持旁路模式和网关模式连接开发时建议用网关连接它可以统一管理本机和远程的运行环境后面改成现场跑的时候不用重新配置连接。2.2 修改PLC的IP和网络配置第一次连接CODESYS运行环境最常遇到的卡点就是找不到PLC或者找到了但连不上。这通常是因为PLC的IP和电脑不在同一个网段。CODESYS运行环境默认会监听网口但你必须确切的知道它的IP地址。如果是软件PLC比如装CODESYS Control Win的工控机可以直接在控制面板或任务栏的CODESYS Control服务里查看和设置网卡IP。如果是硬件PLC一般通过设备自带的显示面板、拨码或者官方工具设置汇川AM系列这类原生CODESYS PLC在OpenPCS工具里或设备Web页面里也能查。排查逻辑很简单先确保电脑和PLC能互相ping通。在电脑的命令行里ping一下PLC的IP通了再进CODESYS。如果是恩智浦、瑞萨这些带多个网口的设备还要确认你把网线插在了EtherCAT专用的那个网口上插到普通网口上当然扫描不到。需要注意EtherCAT通信本身不需要传统IP协议栈参与CODESYS的EtherCAT主站是直接操作网卡底层驱动收发帧的所以从站设备不需要配IP你也不要试图给从站分配IPEtherCAT从站在这个语境下没有传统意义上的IP。这个点很反直觉但理解了EtherCAT主从轮询机制就不会困惑了。还有一个小技巧CODESYS的Device编辑器里在“EtherCAT Master”配置页可以勾选“Auto Startup”这样PLC上电后自动启动EtherCAT通信不用每次都手动登录去点启动对现场设备非常友好。但开发调试阶段我更喜欢手动启动方便观察状态变化。2.3 在CODESYS中添加EtherCAT主站并扫描从站打开CODESYS后新建一个标准工程在设备树里右键点击“Device”选择“扫描设备”如果网络连接正常就能看到可用的控制器添加进去。接下来右键控制器节点选择“添加设备”在设备列表里找到“EtherCAT Master”添加后它会自动创建一个EtherCAT主站节点。这时候主站还是空的右键EtherCAT主站选择“扫描设备”CODESYS就会通过网卡发出EtherCAT帧去寻找网络上的从站。扫描到了从站设备树里会自动出现对应节点比如“DM3E-ECxxx”之类的驱动器型号。这个过程一般几秒钟如果扫描不出来优先检查物理连接网线插紧没有、从站供电有没有、从站站号拨码是否正确、电脑防火墙是否拦截。扫描成功只是第一步此时从站还是“未配置”状态你需要把扫描到的设备“作为从站添加”到工程里CODESYS会读取从站的EEPROM信息把它的基本参数固化到工程中。这个过程意义重大也意味着从站的硬件信息和工程绑定在一起了。从站添加上去之后设备树里会出现“PDO映射”相关的配置节点。很多EtherCAT步进驱动器出厂时已经有了一套默认的PDO映射比如包含目标位置、控制字、状态字、实际位置、实际速度等常用对象。对于单轴点位运动用这套默认映射基本就够了但你需要打开映射表确认几个关键对象的索引和长度正确。常见的几个对象我用表格列一下方便你对照对象索引对象名称方向说明0x6040Controlword控制字PLC→驱动器触发使能、启动、停止等0x6041Statusword状态字驱动器→PLC反映驱动器当前状态0x6060Mode of Operation运行模式PLC→驱动器如CSP、PP、PV等0x607ATarget Position目标位置PLC→驱动器位置命令0x6064Actual Position实际位置驱动器→PLC实际反馈位置0x60FFTarget Velocity目标速度PLC→驱动器速度命令0x606CActual Velocity实际速度驱动器→PLC实际速度反馈检查完PDO映射下一步就是把主站和从站的EtherCAT状态机切换操作搞清楚。CODESYS里通常在登录运行后主站会自动把从站从INIT推到PREOP再推到SAFEOP再到OP你可以在线监视主站和从站节点的状态字。如果从站卡在PREOP或者SAFEOP不往OP走最常见的原因就是某个PDO映射配置不被从站接受或者从站处于“错误状态”需要复位。这个时候先断电重启从站然后重新登录运行如果还不行就打开从站节点的“CoE参数”面板逐个确认需要预写入的参数没有冲突。2.4 驱动器运行模式到底选CSP还是PP在配置驱动器的过程里你一定会遇到选择运行模式的问题。CODESYS SoftMotion控制EtherCAT驱动器主流有两种模式PP模式Profile Position轮廓位置模式和CSP模式Cyclic Synchronous Position周期同步位置模式。PP模式的特点是位置命令通过邮箱一次性写入驱动器驱动器自己完成加减速和到达判定主站只负责发目标位置和启动指令。这种模式通信负载小但轨迹规划在驱动器内部主站对运动过程的掌控弱一些想中途精细调整轨迹会麻烦。CSP模式完全不同主站每个周期通过PDO把目标位置发给驱动器驱动器相当于一个“跟随器”位置环执行完全按照主站发来的命令走。因为轨迹是在CODESYS的SoftMotion里规划出来的主站清楚每一个周期的理想位置和速度所以中途可以随时修改目标位置、做电子齿轮或凸轮联动控制逻辑非常灵活。代价是每个周期都得保证通信实时性一旦通信断了驱动器会按配置的安全行为处理一般是停止或急停。对于步进电机单轴点位运动我强烈建议都试试但重点理解CSP。原因很简单SoftMotion的整套运动功能块MC_MoveAbsolute等在CSP模式下才能发挥出完整能力包括急停、限位、跟随误差监控这些逻辑因为控制权在主站手里。PP模式的用法简单粗暴但遇到回零时序、动态调整这些需求时会捉襟见肘。我实际项目里基本跑CSP驱动器内部模式寄存器设成8CSP模式编号CiA 402里CSP模式就是8然后一切交给CODESYS。3. 步进电机与驱动器的关键参数配置3.1 步进电机工作原理和细分的意义步进电机本质上是一个同步电机转子是永磁体或磁阻结构定子上有多个绕组你按顺序给绕组通电转子就会一步步转到对应位置。以42步进电机的1.8°步距角为例每发一个脉冲转子转1.8°一圈360°需要200个脉冲。这个特性让步进电机天生适合定位但也带来一个问题整步角度太大低速时一顿一顿的运行不平稳而且与机械结构共振明显。细分技术就是来解决这个问题的。驱动器的细分并不是改变电机本身的物理步距角而是把一步再细分成多个微步通过控制绕组电流的精确比例让转子停在两个整步之间的某个位置。16细分时每一步变成了1.8°除以16也就是0.1125°每圈需要3200个脉冲。细分的好处不仅是分辨率提高更重要的是低速运转明显更平滑振动噪声大大降低位置精度也有改善。但要明确细分提高的是控制分辨率不直接等于定位精度真正常见的误差来源还是机械间隙、丝杆背隙和负载变化。细分参数一般在驱动器上用拨码开关设置也有不少驱动器支持通过软件USB或总线在线设置。拨码设置的细分割数通常从400、800、1600、3200、6400、12800、25600到51200不等对应2、4、8、16、32、64、128、256细分。我个人的观点是不是细分数越大越好——细分数过高每个脉冲对应的步数很小高速时驱动器对脉冲处理频率的要求会变得很高反而可能达到上限而且对小脉冲的抗干扰能力也会下降。一般42步进带轻负载16细分到32细分是比较平衡的选择既平滑又不会让脉冲频率爆表。3.2 电流、拨码和ENA使能信号的坑位步进驱动器的电流设置比很多人想象的重要得多。电流太小扭矩不足高速失步的几率大增电流太大电机和驱动器都烫得厉害长时间运行还可能损坏绕组。42步进电机的额定电流一般在1.0到2.0A之间我用的这台是1.7A跑轻负载时把驱动器的峰值电流设到1.2A左右就足够了发热控制很好。驱动器上的电流拨码要按照说明书设置不要拍脑袋。另一个高频坑位是ENA使能信号。普通步进驱动器上ENA端子控制驱动器是否输出电流。有的驱动器是高电平使能有的是低电平使能还有的出厂默认已经通过光耦断开位置拉高不去接这个信号的话电机就是默认使能状态。在做EtherCAT总线控制时驱动器是否使能、何时使能通常由总线的控制字和使能信号共同决定如果你用脉冲模式的老思路去接ENA很可能拔掉脉冲信号后电机还是锁死的或者反过来压根没有保持力。这块特定型号的差异极大我的建议是拿到驱动器先看手册里的“使能逻辑”那一页并实际用手拧一下电机轴测试当前的锁定状态再去改接线或参数不要凭经验。驱动器与电机的接线也要提一句两相四线电机一般区分A、A-、B、B-接线顺序错会表现为抖动不转或反转无力。如果运动方向与预期相反最稳妥的做法是把B和B-对调或者直接把目标位置乘以负一取决于你的机械坐标系怎么定义。对于EtherCAT驱动器很多在总线参数里有一个“方向取反”的选项不用动线改对象值就行比如有的驱动器用某个厂家自定义对象来反转编码器方向。3.3 位置单位换算从脉冲到用户单位的一笔账这是整个项目里最容易被轻视但最容易出问题的部分。你在CODESYS里写“定位到100毫米”这个100是怎么变成驱动器能理解的脉冲数的完全靠单位换算。如果这一步错了位置指令发出去电机要么不动要么冲过头轻则撞限位重则撞机械。换算逻辑是这样的电机每转需要的脉冲数 每圈整步数 × 细分数。42步进是200整步/圈如果设16细分那么电机转一圈需要200 × 16 3200个脉冲也就是3200个用户单位。如果中间加了减速机比如10:1那么输出轴转一圈需要的电机圈数是10对应脉冲数就是3200 × 10 32000。如果丝杆导程是10mm那么输出轴转一圈滑台走10mm所以“1mm对应的用户单位数”就是3200 ÷ 10注意这里如果直接把脉冲当量作为CODESYS的轴单位会得到“1单位 1/3200 mm”这种小数值用起来不直观。我更喜欢反过来定义把CODESYS轴的单位直接设成毫米让SoftMotion帮我做换算。具体做法是在轴配置里找到“单位”相关设置把每个用户单位对应的物理位置设好。比如我希望每发32000个用户单位输出轴走一圈同时丝杆走10mm那么我应该设“位置比例”为“10mm对应320000单位”或者设旋转轴一圈等于10mm这取决于你用直线轴还是旋转轴。不同的驱动器、不同的机械结构这个比例都有差异所以配置好了之后一定要用点动功能让电机转固定圈数用实际游标卡尺或简单刻度去验证别光看屏幕上的数值动没动。这里给一张实测过的换算案例表方便你套用参数数值说明电机步距角1.8°200整步/圈驱动器细分1616细分电机转一圈脉冲数200 × 16 3200即3200个单位/电机圈减速比10:1输出轴转一圈需电机10圈输出轴一圈脉冲数3200 × 10 32000常见的32000脉冲/圈丝杆导程10mm输出轴一圈走10mm位置比例32000单位 10mm一个单位 0.0003125mm目标位置指令50mmCODESYS给50000个用户单位/脉冲数这张表建议贴在调试工位旁边。很多“定位不准”“移动距离不对”的现场问题最后追到根因往往就是这里的比例设错了。比如把整步200直接当脉冲数忘了乘细分数或者把减速比算反了都是真实出现过的低级错误。所以单位换算别偷懒一条条列出来算清楚再拿卡尺验证一次。4. 用CODESYS写单轴运动控制程序4.1 添加SoftMotion并创建轴对象环境装好、EtherCAT组态通了、驱动器参数也设好了接下来就是把运动控制的逻辑写进PLC。CODESYS里运动控制的核心是“轴”对象它相当于一个抽象的轴实例你操作轴对象SoftMotion帮你和具体驱动器通信。具体操作是在设备树中右键应用Application选择“添加对象”找到“SoftMotion General Motion Control”或者直接添加一个“Axis”对象。如果你的工程里还没有SoftMotion库编译时会提示你添加一般自动就能加上。轴对象添加好后要把它和EtherCAT从站关联起来。这一步很多教程叫“轴参照”或者“驱动器映射”本质上就是把轴的功能块输出接到从站的PDO数据上。在轴属性里你会看到“驱动器”或“输出”相关的设置选择你扫描到的EtherCAT驱动器节点即可。轴对象创建完还有一堆参数要配单位设置按上面第3.3节说的限位设置正负软限位必须配这是保命的加减速默认值起始别太猛以及回零参数。运动控制功能块在执行的时候会以轴对象里配置的这些参数作为默认值如果功能块调用时没有显式给参数就自动用轴配置里的值。为了现场调试安全务必将默认加减速设置得保守一些以我这个项目为例起始加速度设了200 mm/s²速度最开始的点动速度只有20 mm/s用来验证逻辑正确性之后在逐步提高。这样即使程序里有没发现的逻辑问题机械也不会瞬间起飞。4.2 运动控制指令ST语言实现点位运动CODESYS支持IEC 61131-3的几种语言我习惯用结构化文本ST写运动控制的逻辑因为它表达复杂状态流程更清晰而且和C语言风格接近可读性好。下面这段代码是这个项目里最核心的动作逻辑实现轴使能、回零、绝对定位、停止这一套基本操作。在编写之前先说明一下思路运动控制功能块很多有“Execute”模式也就是脉冲触发要执行某个动作就把对应的Execute位拉高一个周期完成或失败后功能块会反馈Done、Error等信号。逻辑里最忌讳的是把所有功能块每个周期都无条件调用那样会导致功能块重新触发。正确的做法是用一个模式选择的变量比如枚举类型定义运动模式根据当前模式去调用对应的功能块并且把Execute信号严格限定为上升沿触发。参考代码片段是这么写的PROGRAM Main VAR bEnable : BOOL; // 使能请求 bHome : BOOL; // 回零请求 bMoveAbs : BOOL; // 绝对定位请求 bStop : BOOL; // 停止请求 rTargetPos : LREAL : 50.0; // 目标位置 mm rVelocity : LREAL : 30.0; // 运行速度 mm/s rAcceleration : LREAL : 200.0; // 加速度 mm/s^2 rDeceleration : LREAL : 200.0; // 减速度 mm/s^2 fbPower : MC_Power; fbHome : MC_Home; fbMoveAbs : MC_MoveAbsolute; fbStop : MC_Stop; bPowerOn : BOOL; bHomeDone : BOOL; bMoveDone : BOOL; bError : BOOL; END_VAR// 轴使能Enable和bRegulatorOn同时为TRUE驱动器会进入运行就绪状态 fbPower.Axis : Axis0; fbPower.Enable : bEnable; fbPower.bRegulatorOn : bEnable; fbPower.EnableDrive : bEnable; fbPower(); bPowerOn : fbPower.Status; // 回零无传感器方式当前位置直接设为0 // 实际项目里一般用限位开关索引脉冲方式代码里需要扩展 fbHome.Axis : Axis0; fbHome.Execute : bHome AND bPowerOn; fbHome.Position : 0; fbHome.HomingMode : 0; fbHome(); bHomeDone : fbHome.Done; // 绝对定位 fbMoveAbs.Axis : Axis0; fbMoveAbs.Execute : bMoveAbs AND bHomeDone AND NOT bStop; fbMoveAbs.Position : rTargetPos; fbMoveAbs.Velocity : rVelocity; fbMoveAbs.Acceleration : rAcceleration; fbMoveAbs.Deceleration : rDeceleration; fbMoveAbs.Jerk : 0; fbMoveAbs(); bMoveDone : fbMoveAbs.Done; // 停止 fbStop.Axis : Axis0; fbStop.Execute : bStop; fbStop.Deceleration : rDeceleration; fbStop();这段程序看起来简单但有几个细节值得展开讲。第一MC_Power的Enable、bRegulatorOn、EnableDrive三个位要一起设为TRUE这对应CiA 402状态机里“上电→使能”的标准流程只设Enable一个位轴会处于奇怪的状态。第二回零的HomingMode设置为0表示当前位置设为零适用于演示和单轴验证但实际设备上如果断电后需要恢复绝对位置那么必须用限位开关回零或者用带有绝对编码器的驱动器。第三绝对定位的Execute加上了bHomeDone条件确保回零完成之前不允许定位这个连锁逻辑对于防止意外移动非常重要。我建议你把运动状态输出做成人机界面HMI上的指示灯和故障描述哪个轴激活、当前位置是多少、是否回零完成、报警信息是什么。CODESYS自带的可视化功能就能实现简单拖几个显示控件把上面的变量绑上去调试时能省太多事。4.3 回零方式怎么选上面说了HomingMode等于0的“当前位置设零”只能算应急做法真实设备必须有可靠的回零过程。在CODESYS的MC_Home功能块里HomingMode参数支持多种模式搜索正限位、搜索负限位、搜索原点开关再加索引脉冲一般配合伺服编码器Z相步进开环没有等等。对步进电机加丝杆的常见结构最实用的回零流程是先以较慢速度向原点开关方向运动碰到开关后停止再把坐标系原点设到开关位置或稍微偏离固定距离的位置。如果是闭环步进或带编码器的步进还能用索引信号做最后精确定位精度会更高。回零方向选择要注意极限情况如果回零方向设反了机械会一路撞到硬限位。我的经验是回零速度务必设置得很低一般是正常运行速度的十分之一左右这样即使碰到限位开关冲击也小。回零完成后别急着运动先让输出轴脱离开关位置几毫米避免后续移动到开关触发点附近时出现重复定位问题。4.4 现场联调从空载到带载分几步走程序写完进入联调环节这个环节千万不能着急。我总结了一套顺序基本可以避免大多数低级事故。第一步机械检查。电机和丝杆联轴器锁紧没有滑台是否能在全行程顺畅移动限位开关是否安装位置合理硬限位机械缓冲块有没有。这个步骤别省略很多程序“看起来很对”但第一次上电就撞机问题就在机械没检查。第二步空载通电。驱动器供电正常电机静态锁住手用力拧电机轴应该能感觉到很大的阻力但不能转动这说明使能正常。如果电机轴完全是松的检查使能状态和供电。第三步点动测试。用CODESYS在线模式的点动功能Jog给轴一个很小的速度指令观察电机转向和编码器反馈位置变化方向是否一致。这个方向如果不一致后面所有运动都会有问题。如果发现实际移动方向和命令方向相反就需要反转参数在轴配置或驱动器参数中设置而不是在程序里做符号取反这样逻辑更干净。第四步低速小距离往复运动。发一个较小的绝对定位指令比如10mm观察实际到位位置是否准确重复几次看是否有偏差累积。同时观察加减速过程是否平滑有没有异响和共振。这一步还能顺便验证单位换算是否争取用卡尺量一下实际移动距离和指令是否一致。第五步逐渐提高速度和距离测试极限工况。把速度逐步提高到实际需要的数值确认没有丢步。丢步的判断方法很简单开环步进如果总位置偏差慢慢变大或者高速时电机发出刺耳的啸叫然后突然停转基本就是丢步了。解决办法要么降低速度或加速度要么增大电机电流要么换更大的电机或者检查丝杆负载是否卡顿。带载测试时再重复一遍上面的过程但注意负载变化后加减速和最高速度都要适当降一档。还要观察电机发热情况连续运行半小时后摸一下电机外壳如果烫到不能长时间握持就得降电流或考虑换大电机这个检查对新装的机械尤其重要。5. 调试过程中的高频问题与排查心得5.1 扫描不到从站技术栈哪里出了问题EtherCAT项目里发生率最高的低级问题就是扫描不到从站我先列几个最常见的排查点。物理链路网线有没有插紧、是否需要交叉线现在基本都自适应了但老旧设备不一定、从站供电是否正常、从站有没有上电。从站是节点供电的很多驱动器需要单独供DC24V没有供电当然扫描不出。站号冲突EtherCAT从站通过拨码或者EEPROM设置站号两个从站如果设成了同一个站号主站扫描时会显示异常。单轴不太会遇到但未来扩展到多轴时必须注意。防火墙Windows防火墙拦截了CODESYS的通信端口最典型的现象是电脑能ping通PLC但CODESYS就是扫描不到设备。可以临时关闭防火墙测试在安全可控前提下或者放行CODESYS相关端口。网卡驱动CODESYS EtherCAT主站对网卡有要求一般需要支持以太网直通Raw Ethernet的普通网卡即可但某些USB网卡和高性能网卡有offload功能的可能有问题。建议优先用主板板载网卡并在CODESYS里选择正确的网卡接口。一个实用建议在电脑上用Wireshark抓包看看有没有EtherCAT帧发出或返回如果有返回但CODESYS还是扫描不到大概率是工程配置层面的问题如果连返回帧都没有基本是物理链路或网卡驱动问题。这个判断逻辑能帮你快速缩小排查范围。5.2 从站状态卡住进不了OP怎么办EtherCAT从站要正常工作必须从INIT一路走到OP但实际调试中经常出现从站停在PREOP或者SAFEOP的情况。从站卡在PREOP说明邮箱通信正常但PDO还没成功配置最常见的根因是PDO映射里的某个对象从站不认比如映射长度、数据类型不匹配。解决办法打开从站节点的PDO配置页对照从站手册重新建立默认映射删除自建的客制化映射后再试。有些老版本驱动器固件对CoE参数在线修改支持不好也需要用离线配置方式把参数写进EEPROM。从站卡在SAFEOP说明PDO已经开始交换但还没进入最终运行状态这通常和分布式时钟DC同步有关或者某个必需的过程数据没有更新。一个我实际遇到过的场景是驱动器要求在OP前写入模式参数0x6060但我在工程里没有提前配置这个值主站切OP时从站报错锁死。解决办法是在从站节点的“CoE参数”标签页把0x6060在启动时预写入CSP模式8保存后重新启动通信。如果问题依旧就把从站断电重启很多时候从站的错误状态需要彻底断电才能清除直接在网络上发命令它不响应。5.3 电机不转、抖动、丢步问题不一定在程序调试中最多的情况是“程序看着没问题但电机就是不动作或动作不正常”。这时候先别急着改代码把问题分成三类去查。第一类电机完全不动。查使能状态、查控制字是否已经置位、查驱动器状态字是否显示“运行使能”。CSP模式下如果控制字里的“从站禁止”位没有被正确清除或者模式没切成CSP驱动器可能表现为使能失败。还要检查当前是否有报警比如过流、过压、跟随误差超限大部分驱动器报警时状态字会有明确的错误位CODESYS里可以直接读出来。第二类电机抖动但不连续转。这通常是细分参数和脉冲频率不匹配或者电机缺相有一相绕组没接好也有可能是电流设置过低。缺相的判断很简单摸一下电机外壳缺相时电机会有非常明显的异常振动和发热。电流过低的表现则是空载能转、带载就停或抖。第三类高速跑一段距离后丢步。这是步进系统的经典问题。优先降低最高速度或加长加速时间如果还丢加大驱动器电流到额定值附近再不行就是电机选小了需要换更大机座号的电机或加减速机。注意观察丢步时的异常声响如果伴随尖锐啸叫往往是加速时间太短导致负载惯性超过电机的动态扭矩。这些问题里我踩过最深的一个坑是电流拨码没配对。当时驱动器电流设得偏低低速时一切正常速度一上去就丢步我一度以为是程序里的目标位置溢出或者EtherCAT通信周期太长排查了半天才发现是电流档位的问题。从那以后调试的第一步永远是核对驱动器电流和细分的拨码位置而不是直接动程序。5.4 EtherCAT通信中断、偶发报警怎么处理EtherCAT稳定性总体很好但偶发通信中断确实会发生。最常见的原因是网线和接插件质量问题工业现场的网线必须用带屏蔽层的工业以太网线插头要用金属外壳带卡扣的RJ45或者M12连接器普通家用网线在电柜里就是定时炸弹拖链或长期震动环境下更容易出问题。第二个因素是电磁干扰。步进驱动器本身就是干扰源如果电机动力线和EtherCAT网线在同一个线槽里走线尤其是长距离平行布线通信中断的概率会明显上升。解决办法是强电和弱电分开布线网线走独立的屏蔽线槽屏蔽层在驱动器端单点接地必要时在EtherCAT网线上套磁环。第三个因素是EtherCAT拓扑末端没有终端电阻。虽然EtherCAT是线型菊花链不需要像CAN那样在末端挂120欧姆终端电阻但很多工程师习惯性去接其实EtherCAT标准并不要求终端电阻总线主站自己处理反射。不过如果网线过长或现场干扰严重加一个质量好的交换机或确认主站网卡质量也很重要。偶发中断还有一个隐蔽的软件原因PLC扫描周期和EtherCAT通信周期不匹配。如果你把EtherCAT任务周期设成1ms但PLC主任务周期设成10ms两个任务之间互锁不好偶尔会出现总线任务报错。建议把运动控制和EtherCAT刷新放到同一个周期性任务里比如1ms或2ms任务其余的逻辑任务单独放慢任务这个架构上的调整能避免很多莫名奇妙的偶发问题。5.5 常见问题速查表把这几类问题整理成一张速查表方便现场快速对照现象可能原因检查和解决办法扫描不到从站网线/供电/防火墙/站号冲突查物理连接临时关防火墙安全可控下核对拨码站号扫描到了但无法添加从站EEPROM信息异常用驱动器厂商软件检查从站EEPROM必要时恢复出厂设置从站卡在PREOPPDO映射错误或CoE预写参数失败删除自定义映射重建确认0x6060模式参数预写正确从站卡在SAFEOPDC同步或必需PDO未更新检查DC配置确认所有必需的过程数据已映射电机完全不动使能未生效/报警/模式不对读状态字查报警码确认CSP模式电机抖动不转缺相/电流过低/细分不匹配检查绕组接线调大电流核对细分拨码高速丢步加速过快/电流不足/电机偏小降速度加速度、加电流、换大电机位置越走越偏单位换算错误/机械打滑核对第3.3节换算表检查联轴器锁紧偶发通信中断网线质量/电磁干扰/任务周期不匹配换屏蔽工业网线强弱电分开任务周期对齐回零位置不一致回零速度太快/开关抖动/无索引定位降低回零速度加消抖滤波改用索引回零6. 让调试过程更高效的几个工具和思路6.1 用CODESYS Trace看曲线定位动态问题很多运动控制的问题比如位置振荡、速度超调、跟随误差过大光看终态数值是看不出来的你必须看到动态波形。CODESYS自带的Trace功能就是干这个的你可以把轴的实际位置、实际速度、命令位置这些变量拖进Trace配置窗口设定采样周期和触发条件然后在线运行时就能看到实时曲线。我曾经遇到过一个“走完定位后滑台还会前后晃两下”的问题从报警信息和最终位置完全看不出来但Trace里速度曲线显示出明显的反向振荡一看就知道是加速度设置得太猛机械在加减速阶段发生了弹性变形回弹。把加速度降下来之后曲线立刻平滑了问题解决。这种体验让我养成了一个习惯凡是调运动控制必开Trace先看曲线再下结论。Trace有三种模式值得区分普通示波模式、触发模式和离线模式日常调试用普通示波模式就够现场复现不了的问题可以用触发模式捕捉方便后期分析。采样周期建议设到运动任务周期的一半比如运动任务是1msTrace采样设500µs如果支持这样曲线分辨率足够。6.2 用第三方变量记录工具抓取长时间曲线Trace虽好但它毕竟是开发环境的附属功能不适合长期挂在现场。现场设备跑上几个小时甚至几天后出现偶发定位偏差用Trace去抓很不现实。这时候可以利用第三方工具记录CODESYS里的变量比如PLC-Recorder这类软件可以直接通过CODESYS的通信接口定时采集指定变量存成CSV文件或数据库还能用它的回放功能分析历史曲线。这类工具的价值在于长时间无人值守采集。我调试那台设备时为了复现一个偶发的位置偏移用PLC-Recorder连续记录了72小时的轴位置、速度、驱动器报警码和几个关键的数字量输入最后发现偏移总是出现在现场某台大功率设备启动的时间点附近进一步排查确认是尖峰干扰引起的极小概率通信重试最终在网线上加磁环解决。如果没有长时间记录能力这种问题几乎不可能定位。采集变量时要注意别选太多通信采样会占用PLC一部分资源建议选十几个关键变量就够了采样周期100ms对长期趋势分析完全足够。关键报警、真正的动态过程分析还是交给Trace或控制器内部的缓冲长期记录工具专注看趋势和偶发问题。6.3 从单轴到多轴下一步可以走的几条路单轴步进做通了CODESYS和EtherCAT的地基就打好了后面往复杂方向扩展有几种常见路线。第一条是继续深耕运动控制把CODESYS SoftMotion的高级功能用起来。比如电子齿轮耦合MC_GearIn让从轴跟随主轴比例运动适合同步送料这些场景再比如凸轮表Cam Table实现周期性的非匀速运动还有CNC功能用G代码描述轨迹SoftMotion内置了解释器几行代码就能让两个轴走出直线插补或圆弧插补这是个很大的方向。第二条是往更精密的控制算法走。步进电机本身有失步和共振的先天限制换用带编码器的闭环步进或者真正的伺服电机后配合EtherCAT的DC同步能实现更高精度的多轴联动。很多人会研究步进电机FOC控制简单说就是把电机电流按矢量分解实现更平滑、更高性能的力矩控制很多高端步进驱动已经集成这类算法总线侧看到的还是一个标准CiA 402驱动器。第三条是系统架构层面。从单机控制走向分布式控制一个主站带十几个从站EtherCAT的拓扑能力能发挥出来或者把CODESYS软PLC和HMI、数据库、MES系统对接让设备数据接入工厂信息化网络。不管往哪个方向走你在单轴项目里建立的那套方法——先查物理链路再看状态字分析波形记录趋势——都会一直派得上用场。7. 一些个人的实话实说项目收尾的时候回头总结有一件事印象特别深所有看起来“玄学”的疑难问题最后追下去都会落到一个非常具体的物理或配置细节上。电机不转查出来是使能光耦的接线定义搞反了位置偏移查出来是减速比的小数点位数没算够偶发报警查出来是网线在电柜门来回开关时被压了一次。这些问题没有一个是EtherCAT本身或者CODESYS的Bug全是应用层面的一点点疏忽。所以我现在调试任何新设备都会强迫自己按顺序来机械、接线、供电、参数表、单位换算、点动、小距离定位、连续运行、趋势记录一步都不跳。关于学习路线我的建议是不管你最终做不做步进电机都值得花一两个晚上把CODESYS加EtherCAT的这套最小系统搭起来亲手跑通一次单轴点位运动。它把工业自动化里“上位逻辑、总线通信、驱动器参数、机械执行”这四层核心概念完整串了一遍而且成本可控、风险低。走通之后再去看多轴、看伺服、看CNC心里会非常有底因为你已经知道每一层谁是干什么的出了问题该去查哪一层。最后说一个实用小技巧给CODESYS工程里的轴、变量、功能块起名字时不要偷懒用Axis0、Var1这种默认名而是直接体现物理含义比如Axis_X_Slide、rTargetPos_mm、bHomeLimit_Switch。项目中后期或者隔几个月再回来维护程序时这些清晰的名字帮你省下的时间会远超当初命名时多花的那几分钟。自动化项目的坑大多不在技术前沿而在这些不起眼的地方反复出现。
返回列表