
1. 为什么我要在AM402上自己封装轴控功能块汇川AM402这台PLC在中小型运动控制项目里出镜率很高搭配IS620N伺服走EtherCAT总线一套下来性价比确实能打。但真正上手做过项目的人都知道AM402的编程环境基于CODESYS体系官方库虽然提供了不少运动控制功能块可真到项目里直接调用官方块往往会遇到几个很现实的问题参数太多、状态机太复杂、不同轴之间的逻辑复用困难尤其是当你要控制三到五根轴做类似的点位运动时每个轴都去写一遍使能、回零、绝对定位、相对定位、急停复位代码量会迅速膨胀后期维护也很痛苦。我最初做第一个AM402项目时就是这种状态三根轴每根轴的控制逻辑几乎一样但因为是复制粘贴出来的改一个参数要改三个地方调试的时候经常出现某根轴的加减速时间忘了同步修改结果运行起来一根轴明显比另外两根抖。那次之后我就下定决心把轴控逻辑封装成自己的功能块一次写好到处调用。这篇内容就是把我封装轴控功能块的完整思路和实操过程拆开来讲包括功能块接口怎么设计、状态机怎么规划、IS620N的参数怎么配合、EtherCAT从站怎么配置、常见故障怎么排查。适合已经接触过AM402和IS620N、想进一步提升代码复用能力的工程师也适合刚开始做运动控制项目、想少走弯路的朋友。我会尽量把每个设计决策背后的原因讲清楚而不是只丢一段代码出来。2. 封装之前必须想清楚的几件事2.1 功能块到底要覆盖哪些功能很多人一上来就开始写代码结果写到一半发现接口不够用又回头改改完发现调用处全要跟着改。我的做法是先列清单把一根轴在实际项目中可能用到的操作全部列出来然后判断哪些放进功能块哪些留在外面。对于IS620N这种支持EtherCAT的伺服一根轴典型需要的操作包括伺服使能、伺服断开、回零、绝对定位、相对定位、速度运行、急停、故障复位、状态读取。这些操作里使能和断开是基础回零和定位是高频速度运行在某些场合用得上急停和复位是安全相关。我的选择是把使能、断开、回零、绝对定位、相对定位、急停、复位这七个功能全部封装进去速度运行单独做一个简化版功能块。原因是速度运行的使用场景和点位控制差异较大混在一起会让状态机变得臃肿。2.2 接口设计输入输出怎么定接口设计是封装的核心。我的原则是输入参数尽量精简能设默认值的就设默认值输出参数要足够诊断问题。输入侧我保留了这些轴号或者轴引用、使能命令、回零命令、绝对定位命令加目标位置、相对定位命令加距离、急停命令、复位命令、速度设定、加减速设定。输出侧包括当前状态、当前位置、当前速度、故障代码、到位标志、回零完成标志、使能状态。这里有个细节值得说轴引用我用的是AXIS_REF类型这是CODESYS体系里标准的轴引用方式直接和EtherCAT从站映射。不要用轴号去索引那样每次调用都要查表效率低还容易出错。2.3 状态机怎么规划才不会乱状态机是轴控功能块的骨架。我见过一些实现状态机写得很随意导致急停之后状态回不去或者回零过程中发定位命令直接卡死。我的状态机规划是这样的空闲态等待命令使能中等待伺服使能完成就绪态伺服已使能可以接受运动命令回零中执行回零流程定位中执行绝对或相对定位急停态收到急停命令后的状态故障态伺服报错后的状态状态之间的跳转条件必须明确。比如从就绪态到定位中条件是收到定位命令且伺服无故障从定位中回到就绪态条件是到位信号有效或者运动被中断。急停态只能通过复位命令回到空闲态这样设计是为了强制操作人员确认故障已排除。注意状态机里一定要处理命令冲突的情况。比如正在回零的时候又来了定位命令这时候应该忽略定位命令还是中断回零我的做法是忽略并且给出一个命令冲突的标志位让上层逻辑知道发生了什么。3. IS620N在AM402上的EtherCAT配置细节3.1 从站描述文件与设备扫描IS620N要挂到AM402的EtherCAT总线上第一步是确保从站描述文件已经安装。汇川官方会提供XML格式的ESI文件在CODESYS的设备仓库里导入之后才能在扫描设备时识别到IS620N。扫描的时候有个坑我踩过如果伺服驱动器的站地址拨码和软件里配置的不一致扫描出来的设备会显示成通用从站而不是IS620N。所以上电之前先确认拨码地址一般从1开始依次排。扫描完成后在设备树里应该能看到IS620N的图标点开能看到它的过程数据对象配置。3.2 过程数据对象映射怎么选过程数据对象映射决定了每个通讯周期里PLC和伺服之间交换哪些数据。IS620N支持多种映射组合我一般用这套PLC到伺服控制字、目标位置、目标速度、运行模式、加减速时间。 伺服到PLC状态字、当前位置、当前速度、故障代码、到位标志。这套映射覆盖了点位控制的所有需求。如果你的项目需要转矩控制那还要加上目标转矩。映射的时候注意数据长度位置一般是32位速度和转矩是16位或32位别搞错了导致数据错位。3.3 单位换算与电子齿轮比这是最容易出问题的地方。IS620N的位置单位是脉冲而我们在程序里通常用毫米或者度。中间需要一个换算系数这个系数由电子齿轮比和机械结构共同决定。举个例子丝杠导程10毫米电机编码器17位那么电机转一圈是131072个脉冲对应10毫米。换算系数就是131072除以10等于13107.2脉冲每毫米。这个系数要写进功能块的参数里所有位置相关的输入输出都要经过这个系数转换。我建议把这个系数做成功能块的输入参数而不是写死在代码里。因为不同项目的机械结构不一样写死了换个项目就要改代码做成参数只需要改配置。4. 轴控功能块的内部实现拆解4.1 使能与断开的处理逻辑使能逻辑看起来简单其实有讲究。我的做法是收到使能命令后先检查伺服是否无故障如果有故障先自动复位一次复位成功再使能。使能过程中要监控状态字如果超过设定时间还没使能成功就报超时故障。断开逻辑相对简单但要注意断开之前如果轴在运动应该先减速停止再断开直接断开会造成机械冲击。我在功能块里做了判断如果当前状态是定位中或回零中收到断开命令先触发停止等停止完成再断开使能。4.2 回零流程的完整实现回零是轴控里最复杂的部分。IS620N支持多种回零模式我常用的是找原点开关加Z相信号的方式。流程是这样的设置回零模式启动回零轴以设定速度向原点方向运动碰到原点开关后减速停止反向低速寻找Z相信号找到Z相后位置清零回零完成功能块里要处理回零超时、原点开关未触发、Z相信号丢失这些异常情况。我的做法是给回零流程设一个总超时时间超时后报故障并停止轴运动。提示回零速度不要设太高尤其是寻找Z相的那段低速速度太高容易错过Z相信号。我一般设成额定速度的百分之五到百分之十。4.3 绝对定位与相对定位的差异处理绝对定位和相对定位在底层都是调用运动控制指令区别在于目标位置的计算方式。绝对定位的目标位置直接来自输入参数相对定位的目标位置是当前位置加上输入的距离。但有个细节相对定位如果连续触发每次都要以最新位置为基准。我在功能块里做了处理每次执行相对定位前先读取当前位置再计算目标位置避免用缓存的位置导致累积误差。到位判断我用的是伺服的状态字里的到位标志同时加一个位置误差判断作为双重确认。有些场合伺服到位标志会提前置位实际位置还有微小偏差加上误差判断更可靠。4.4 急停与故障复位的安全设计急停的处理必须是最高优先级。我的功能块里急停命令一旦触发立即中断当前所有运动状态机强制跳到急停态同时给伺服发停止指令。急停态下除了复位命令其他命令一律忽略。故障复位要区分两种情况一种是伺服本身报故障需要先排除故障原因再复位另一种是逻辑层面的故障比如超时复位后可以直接恢复。功能块里我做了故障分类伺服故障需要确认故障代码清零后才允许复位逻辑故障可以直接复位。5. 调试过程中那些让人头疼的问题5.1 伺服使能后轴不动这个问题我遇到过好几次原因各不相同。最常见的是运行模式没设对IS620N在EtherCAT模式下需要明确设置运行模式如果模式设成了位置模式但指令用的是速度模式轴就不会动。另一个原因是控制字的状态机没走完。伺服使能需要控制字按特定顺序变化如果跳过了某个步骤伺服会停在使能过程中间状态。我的建议是用功能块里的状态输出监控使能流程走到了哪一步这样排查起来很快。5.2 定位完成但位置有偏差位置偏差通常来自三个方面电子齿轮比算错了、加减速时间太短导致过冲、机械间隙。先检查齿轮比用一个小距离的定位测试看实际走的距离和指令距离差多少如果差得很多就是齿轮比问题。如果齿轮比没问题偏差在几个脉冲以内那可能是加减速太猛。适当加大加减速时间观察偏差是否减小。如果还有固定方向的偏差那大概率是机械间隙需要在程序里做补偿。5.3 回零找不到原点回零失败的原因比较多。先确认原点开关的信号有没有进到PLC可以在EtherCAT的过程数据里监控开关状态。如果开关信号正常再看回零速度是不是太快错过了开关信号。还有一种情况是回零方向设反了轴往远离原点的方向跑永远碰不到开关。这个在功能块里加一个运动距离限制超过限制就报错停止避免轴一直跑下去撞限位。5.4 多轴同时运动时通讯抖动多轴同时运动时EtherCAT的通讯负载会上升。如果周期设得太短比如1毫秒而轴数又多可能会出现通讯抖动表现为轴运动不平稳。我的经验是轴数在五根以内通讯周期设2毫秒足够轴数更多的话考虑设4毫秒。同时要确保PLC的运算负载不要太高功能块的代码要精简避免在高速任务里做复杂运算。6. 功能块的复用与工程管理6.1 把功能块做成库文件功能块调试稳定之后我建议做成库文件。CODESYS支持把功能块导出成库下次新项目直接导入不用再复制代码。库文件里还可以附带文档说明写清楚每个接口的含义和使用注意事项。做库的时候注意版本管理每次修改都记录改了什么避免不同项目用了不同版本的功能块导致行为不一致。6.2 多轴调用的参数配置表一个项目里有多根轴的时候我习惯做一个参数配置表把所有轴的换算系数、加减速时间、回零速度这些参数集中管理。功能块调用的时候从配置表里读参数而不是每个调用处单独写。这样做的好处是改参数只改一个地方而且参数集中在一起对比不同轴的配置也很方便。配置表可以用结构体数组实现每个元素对应一根轴。6.3 工程文件的组织方式工程文件我一般按功能分文件夹轴控功能块放一个文件夹EtherCAT配置放一个人机界面变量放一个主程序放一个。这样结构清晰别人接手也容易看懂。主程序里我习惯把每根轴的功能块调用单独写成一个程序段加上注释说明这根轴是做什么的。调试的时候可以单独禁用某根轴不影响其他轴。7. 一些实际项目中的经验补充7.1 关于IS620N的参数备份IS620N的参数可以通过上位机软件备份和恢复。项目调试完成后一定要把伺服参数备份出来和PLC工程一起存档。我遇到过伺服驱动器故障更换的情况如果没有参数备份重新调试要花很长时间。备份的时候注意把电子齿轮比、加减速时间、回零模式这些关键参数单独记录一份方便快速核对。7.2 功能块在不同项目间的移植功能块移植到新项目时最容易出问题的是单位换算系数和轴引用。系数要按新项目的机械结构重新计算轴引用要重新映射到新的EtherCAT从站。这两项确认无误后其他逻辑一般不用改。移植后先做单轴测试确认使能、回零、定位都正常再联调多轴。不要一上来就跑多轴联动出了问题不好定位。7.3 什么时候该用官方库什么时候该自己封装官方库的优势是经过验证、功能全面缺点是接口复杂、学习成本高。我的判断标准是如果项目里只有一两根轴且运动逻辑简单直接用官方库更省事如果轴数多、逻辑重复度高、或者有特殊需求那就自己封装。自己封装不代表完全不用官方库底层运动控制指令还是调用官方的封装的是上层的状态管理和接口适配。这样既保证了底层可靠性又获得了上层的灵活性。7.4 调试时善用Trace功能AM402的编程环境里有Trace功能可以实时记录变量变化。调试轴控功能块的时候把状态机变量、位置、速度、控制字、状态字都加到Trace里运行一遍就能看到完整的时序哪里卡住了一目了然。我习惯在回零和定位的时候开Trace记录整个过程的变量变化。这样即使现场出问题把Trace数据拿回来分析也能快速定位原因。7.5 安全相关的注意事项轴控功能块涉及机械运动安全永远是第一位的。功能块里必须包含软限位保护超过限位立即停止。急停逻辑要独立于正常控制逻辑确保任何时候都能生效。调试阶段建议先脱开机械负载空载测试功能块的逻辑。确认逻辑无误后再接上负载从低速小距离开始测试逐步加大速度和距离。8. 完整工程的结构说明我最终封装的这个轴控功能块工程结构大致是这样的一个主程序负责调用各轴的功能块实例一个轴控功能块文件包含核心逻辑一个参数配置结构体定义所有轴的参数一个EtherCAT配置文件夹放从站描述文件和映射配置。功能块的输入输出接口前面已经说过这里补充一下内部变量的组织。内部变量分几类状态机变量、运动控制指令变量、诊断变量、参数缓存变量。状态机变量记录当前状态和状态切换条件运动控制指令变量是发给伺服的底层指令诊断变量记录故障代码和超时计数参数缓存变量保存从配置表读来的参数。代码风格上我尽量保持简洁每个功能块不超过五百行超过就考虑拆分。注释要写清楚每个状态的含义和跳转条件方便后期维护。这套功能块在我最近三个项目里都用了从三轴到六轴都有稳定性没问题。当然每个项目都有各自的特殊情况功能块也在不断迭代但核心框架没变过。如果你也在做AM402加IS620N的项目建议先按这个思路搭一遍跑通之后再根据实际需求调整。