三轴示教系统 PLC 控制方案:点位记录与伺服插补实践 📅 发布时间:2026/9/1 10:36:55 👁 浏览次数: 简介面向工业自动化与PLC编程开发者资源围绕汇川H5U PLC与MCGS触摸屏实现三轴示教系统覆盖示教点录入异步处理、三轴直线插补参数配置、圆弧插补逻辑及离线仿真调试可直接作为三轴运动控制模板移植到同类应用场景。包内共3个文件以HTML界面文件为主配合inscode工程入口与gitignore配置ZIP压缩包整体仅7KB结构轻量便于快速查看、运行、二次开发及离线仿真验证。目前已有57人学习适合需要落地三轴控制项目的工程师参考。源码附带详细注释既说明触摸屏界面设计与PLC运动控制指令的对应关系也给出仿真模式下的数据处理方式、运动模式扩展方法以及通讯故障的解决思路便于读者按需裁剪功能或将其改造成其他轴控项目的基础模板。1. 项目拆解三轴示教系统到底在解决什么问题做设备开发这么多年我接到的需求里“示教”二字出现的频率一直不低。它本质上解决的是一个很现实的问题工艺路线复杂多变每条路径的坐标点位、运行速度、停留时间都不一样如果每次更换产品都要重新写一遍PLC程序那调试周期会拖到让人崩溃。三轴示教系统的核心思路就是把人从代码里解放出来。操作员只需要通过触摸屏或手控器手动把设备移动到目标位置记录下这个点的坐标再录完一整条轨迹的若干个点系统就能自动把这些点串起来生成可执行的运行程序。下次要复现同样的动作直接调用编号就能跑。说白了就是把“改代码”变成了“录点位”把工程师从现场反复修改程序的泥潭里拉出来。这套系统的核心构成并不复杂上位交互层触摸屏、控制层PLC、执行层三台伺服丝杠/皮带结构。汇川的H5U系列PLC在中小型设备里做示教系统很合适单机支持轴数足够多EtherCAT总线速度也快最关键的是它把电子凸轮、插补、比较中断这些都做进了系统底层不用自己拼凑一堆复杂逻辑。我这个项目用的是汇川H5U-1614MTD SV660N伺服 IT7000触摸屏下面把完整的设计思路和源码核心逻辑拆开讲清楚。2. 硬件选型与系统架构设计2.1 为什么选H5U而不是小型PLC很多朋友喜欢用汇川EASY系列或者H1U这类小型机做运动控制如果只是单轴定位、简单启停小机型确实够用价格还便宜。但三轴示教系统有一个明确的分水岭总线周期和轴组联动能力。示教系统要求三轴同时采集位置、同步执行插补动作小型PLC走脉冲输出的话脉冲频率上限、加减速曲线、多轴同步精度都会被物理接口限制住。H5U在架构上有几个实打实的优势。第一EtherCAT从站数量最多支持32个三台伺服加远程IO绰绰有余第二内置MC_MoveAbsolute、MC_MoveDirectAbsolute、MC_MovePath等符合PLCopen规范的运动指令开发时不用自己在底层写梯形图去做插补第三H5U支持后台任务示教过程中可以一边处理HMI的写入指令一边保持高速位置采集不卡顿这个在低价位PLC里非常少见。还有一个很实际的点汇川的InoProShop软件把PLC编程和伺服调试打通了。伺服驱动器的参数可以直接在InoProShop里批量配置、监控、备份示教系统里三台伺服参数是高度相似的批量修改能省掉大量重复劳动。2.2 伺服选型和机械传动配套三轴示教系统的伺服选型有一个核心矛盾精度和速度往往互相牵制。X轴通常是长行程传动负载重选大惯量伺服配高刚性丝杠Y轴行程中等速度和精度要兼顾Z轴一般要承受加工头或者点胶阀的重量还要考虑断电自锁所以必须配带抱闸的伺服电机。我的选型方案是SV660N系列X轴用1.5kW电机配2005研磨丝杠Y轴用750W电机Z轴用750W带抱闸电机。这个配置在负载20kg以内的三轴平台上是比较稳的。SV660N接在EtherCAT总线上分辨率是23位绝对值编码器理论上定位精度可以做到微米级实际机械装配下来稳定在0.02mm以内没问题。这里提醒一句示教系统对机械回程间隙非常敏感。如果用的是普通滚珠丝杠正反向切换时丝杠间隙会直接影响重复定位精度。有条件的话配预压型螺母或者直接上研磨级丝杠示教点位重复精度会好看很多。2.3 控制架构和程序任务划分整个系统的程序架构我划分成了三个任务模块通讯任务负责和IT7000触摸屏走Modbus TCP通信接收手动示教指令、点位编号、速度设定值回传当前位置、运行状态、报警信息。示教任务也叫“录点模式”。操作员通过HMI上的方向按钮把轴移到目标位置按下“记录”按钮PLC把当前三轴坐标写入点位数组对应的索引位置。运行任务自动模式下手动触发程序从点位表里读取目标坐标按设定速度执行插补运动轨迹走完后自动停止或循环。这三个任务之间通过全局变量和数据块进行数据交换互不干扰这也是H5U这种中大型PLC相比小型PLC编程时的一个明显优势——程序组织可以真正做到模块化后面维护起来不用在一大片梯形图里大海捞针。3. 核心代码逻辑示教点数据的存储与处理3.1 点位数据结构设计示教系统的根基是点位数据。最开始我图省事直接建了三个数组分别存X、Y、Z坐标后来发现一个问题如果每个轴的数据单独存删除中间某个点位时后面的点都要往前挪一次不同轴的数组必须同步挪代码又啰嗦又容易出错。后面改成了结构化数组用H5U的DUTData Unit Type功能定义一个点位结构体TYPE POINT_DATA : STRUCT X : REAL; // X轴绝对坐标单位mm Y : REAL; // Y轴绝对坐标单位mm Z : REAL; // Z轴绝对坐标单位mm Speed : REAL; // 该点运行速度单位mm/s DwellTime : REAL; // 该点停留时间单位s IsValid : BOOL; // 该点是否已示教有效点位 END_STRUCT END_TYPE然后在全局变量区建点位表VAR_GLOBAL PointTable : ARRAY[1..100] OF POINT_DATA; // 点位表最多支持100个点位 CurrentPointIndex : INT; // 当前正在示教或运行的点位索引 TotalPointCount : INT; // 已示教的有效点位总数 END_VAR用结构体存点位最大的好处是扩展性。后面有客户跟我说要加“该点是否需要输出气缸动作”的需求我只需要在结构体里加一个BOOL变量运行逻辑里判断一下整套代码不用动筋骨。做设备的人应该都懂这种“留了一手”的设计有多重要。3.2 手动示教与点位记录示教功能的核心逻辑是把手动模式下伺服的实际位置实时采集进PLC并写入点位表。H5U的EtherCAT从站状态可以通过系统变量读取用MC_ReadActualPosition指令读每个轴的绝对位置。这里有一个非常容易踩的坑位置单位换算。伺服驱动器的电子齿轮比设置不同PLC读到的轴位置可能是什么unit用户单位、pulse脉冲、mm毫米等不同单位的数值。我的项目里把驱动器和PLC统一设置成mm作为用户单位读取出来的数直接用省掉了每次运算都要做单位转换的麻烦。示教记录的核心逻辑用结构化文本ST写比梯形图清晰太多// 手动示教将当前位置记录到指定点位索引 IF bTeachRecord THEN PointTable[CurrentPointIndex].X : MC_ReadActualPosition(AxisX); PointTable[CurrentPointIndex].Y : MC_ReadActualPosition(AxisY); PointTable[CurrentPointIndex].Z : MC_ReadActualPosition(AxisZ); PointTable[CurrentPointIndex].Speed : rTeachSpeed; // 从HMI读取设定速度 PointTable[CurrentPointIndex].DwellTime : rDwellTime; // 从HMI读取停留时间 PointTable[CurrentPointIndex].IsValid : TRUE; TotalPointCount : MAX(TotalPointCount, CurrentPointIndex); bTeachRecord : FALSE; // 记录完成复位触发信号 END_IF这段逻辑不复杂但有几个细节处理能让现场操作体验好很多。第一HMI上记录按钮用的是“上升到沿触发”按一次只记一个点防止操作员长按按钮导致同一个点重复记录。第二点位索引可以在HMI上手动切换方便补录中间点。第三所有手动运动都是点动模式我设置了慢速、中速、快速三档速度切换定位粗调快速走最后微调用慢速效率高还不容易超调。3.3 点位运行与轨迹插补点位记录完成后自动运行的逻辑有两种选择PTP点到点运动和CP连续轨迹插补。PTP模式用MC_MoveAbsolute指令走的是每个轴独立定位三轴同时启动但速度曲线互不干涉。这种模式适合点位之间不需要“走直线”的工艺比如点胶、焊接、螺丝锁付——每个点单独定位到达后执行动作再移动到下一个点。CP模式用的是MC_MoveDirectAbsolute或MC_MovePath走的是笛卡尔空间插补三轴严格同步走出来的轨迹是三维空间里的直线或圆弧。这种模式适合需要“走轨迹”的工艺比如涂胶轨迹、切割轨迹、轨迹跟踪。我的代码里做了一版支持两种模式的切换// 自动运行根据点位表顺序执行支持PTP/CP切换 CASE runState OF 0: // 待机状态等待触发 IF bStartAuto THEN CurrentPointIndex : 1; runState : 1; END_IF 1: // 启动运动 IF bRunMode_PTP THEN // PTP模式三轴独立绝对定位 MC_MoveAbsolute(AxisX, PointTable[CurrentPointIndex].X, rRunSpeed); MC_MoveAbsolute(AxisY, PointTable[CurrentPointIndex].Y, rRunSpeed); MC_MoveAbsolute(AxisZ, PointTable[CurrentPointIndex].Z, rRunSpeed); ELSE // CP模式三轴空间直线插补 MC_MoveDirectAbsolute(AxisGroup, PointTable[CurrentPointIndex].X, PointTable[CurrentPointIndex].Y, PointTable[CurrentPointIndex].Z, rRunSpeed); END_IF runState : 2; 2: // 等待到位 IF bAllAxisInPosition THEN // 到位后延时执行点动作 runState : 3; END_IF 3: // 到位停留 IF PointTable[CurrentPointIndex].DwellTime 0 THEN // 执行停留计时 DwellTimer(IN : TRUE, PT : PointTable[CurrentPointIndex].DwellTime); IF DwellTimer.Q THEN // 停留结束切换下一个点 CurrentPointIndex : CurrentPointIndex 1; DwellTimer(IN : FALSE); IF CurrentPointIndex TotalPointCount THEN runState : 0; // 全部点位执行完 bStartAuto : FALSE; ELSE runState : 1; END_IF END_IF ELSE // 无停留时间直接切换下一点 CurrentPointIndex : CurrentPointIndex 1; IF CurrentPointIndex TotalPointCount THEN runState : 0; bStartAuto : FALSE; ELSE runState : 1; END_IF END_IF END_CASE这个状态机的框架几乎是所有示教系统的通用骨架。如果你自己写示教程序完全可以照这个逻辑根据你的PLC型号改一版。3.4 速度规划与拐角处理点位之间的速度规划是区分“能用”和“好用”的关键。如果每个点之间都是急停急走三轴平台机械冲击很大运行时间也会拖长而且动作看起来非常生硬。工业上处理这个问题的办法叫“前瞻速度规划”通俗说就是让设备在到达下一个点位前就开始提前减速通过判断轨迹夹角来决定拐角处允许的最大通过速度。H5U的运动库在这方面已经内置了部分处理能力。MC_MoveDirectAbsolute指令自带S曲线加减速和拐角平滑策略只需要在轴组配置里设定好加速度、减速度和急停时间Jerk实际的运动效果就会好很多。我项目里的实际配置是加速度500mm/s²减速度500mm/s²急停时间50ms。点与点之间的距离如果小于5mm速度自动降低到设定值的60%去走。这个参数在20kg负载的三轴平台上是比较合适的既保证效率又不会让机械振动太大。如果你的平台更轻、刚性更好可以把加速度往上调效率会明显提升。4. 实操中的常见问题与排查技巧4.1 伺服使能冲突和EtherCAT总线报警我做这套系统时遇到频率最高的坑是伺服使能冲突。现象是HMI上点了伺服使能PLC侧也写入了使能信号但伺服就是没反应或者报使能冲突报警。排查思路分两步。第一检查PLC程序里是不是有两个地方在同时控制同一个伺服轴的使能信号。H5U软件里可以用“交叉引用”功能查这个信号被哪些地方写过如果伺服使能同时被HMI关联的变量和运动指令的轴使能位控制就会冲突。第二检查EtherCAT配置里的从站映射确认伺服驱动器的控制字Controlword和状态字Statusword地址没有重复映射到其他变量。EtherCAT断站报警也遇到过。表现是设备运行一段时间后某个伺服突然报同步丢失停机后重新上电又能恢复。这种情况大概率是接线问题EtherCAT网线要用带屏蔽层的专用电缆接地要可靠而且从站之间的网线长度不要超过20米。还有一个容易忽略的点终端电阻。EtherCAT不是CAN总线不需要加终端电阻但如果你的网络里节点间距过远信号衰减造成的偶发断站也会出现排查的时候别漏了这个方向。4.2 示教点位跑偏和重复定位精度差这是示教系统用户最崩溃的问题录好的点位今天跑是对的明天跑就偏了0.5mm或者同一段轨迹跑第一次和跑第三次位置不一样。机械层面重点检查三个位置联轴器是否松动、丝杠螺母座是否松动、伺服电机编码器线是否接触良好。电气层面最容易被忽略的是伺服驱动器参数里“惯量比”设置不对。SV660N的刚性参数默认值是自动但如果你手动改过速度环增益位置环的响应就会变硬机械结构稍有间隙就会表现出定位过冲或者回程误差。我调试时的一个经验先把示教系统里所有轴的伺服参数用InoProShop导出一份初始配置备份调完机械后再逐项恢复伺服自动调谐让伺服自己重新学一遍负载惯量。不要一开始就手动硬调伺服参数容易越调越糟糕。还有一个高级技巧如果是绝对值编码器示教点位存的是绝对坐标理论上断电后重新上电位置不会丢。但如果用的是增量编码器断电后必须回原点否则点位表里记录的坐标全是相对参考点的偏差跑出来全偏。在这个项目里我强烈建议用带绝对值编码器的伺服客户现场的体验完全不一样。4.3 HMI通信超时和点位擦写不同步IT7000触摸屏和H5U走Modbus TCP通信最常用的方式是Moudbus从站地址映射。H5U里可以把全局变量区的数据映射成Modbus寄存器地址然后HMI通过读写寄存器来交互。有一个坑是HMI上点位表数据的写入是多个寄存器连续写比如X坐标一个REAL要占2个寄存器Y、Z再加4个速度又占2个。如果HMI上点的“保存”按钮触发的是分多次写入中途PLC侧如果正好在读取点位表就可能读到一组不完整的数据导致轨迹跳变。我的解决方案是给点位表加了一个“写入有效标志”寄存器。HMI上做点位数据编辑时先置“正在写入”标志写入完成后清掉标志。PLC侧读取点位数据前先检查这个标志如果为真就等待直到写入完成再读取。这个思路叫“软件握手”简单又可靠。4.4 程序下载后示教点位丢失的问题开发调试阶段最烦的一件事程序一更新重新下载刚才在HMI上辛辛苦苦示教的点位全没了。原因是PLC程序的变量区在下载代码时会被重新初始化。如果要让点位数据在程序更新后还能保留要么把点位数据存到PLC掉电保持区H5U的保持型变量区要么在程序下载后用备份功能从旧程序导出点位数据再导入到新程序里要么在HMI侧做数据存储让HMI在PLC启动后自动回写点位表。我的做法是三管齐下点位表变量定义在掉电保持区平时执行自动备份到U盘客户现场如果误操作清空了数据可以从备份文件一键恢复。这套机制实际用下来救了很多次场。5. 源码框架说明和二次开发建议5.1 程序文件结构和功能块划分整套源码在InoProShop里的工程结构是这样的PLC_PRG主程序初始化调用、运行模式切换、故障复位逻辑。PRG_Teach示教功能块手动点动控制、点位记录逻辑、点位测试。PRG_AutoRun自动运行功能块点位顺序执行状态机、插补控制逻辑。PRG_Communication通信功能块Modbus寄存器映射、HMI数据交互。PRG_Alarm报警管理功能块轴报警实时采集、历史报警记录。DUT类型定义点位数据结构、报警结构体。这种划分方式的好处是如果有人只需要改通信协议就不用动运动控制的部分如果有人要加第4个轴主要在点位结构体、轴组配置和AutoRun功能块里三处改动就行不需要全局翻代码。5.2 二次开发的核心扩展方向当前源码已经支持100个点位、PTP/CP双模式实际项目里最常被要求扩展的三个方向是第一圆弧插补。当前示教只支持空间直线插补如果工艺里有圆弧轨迹需要在点位表中增加圆弧半径、圆心坐标、方向等字段然后在执行逻辑里接入MC_MoveCircularAbsolute指令。H5U支持空间圆弧插补数据结构和处理逻辑都具备扩展工作量不大。第二多轨迹管理。比如一个产品要打磨4个不同的面每面一条轨迹需要把点位表扩展成二维数组增加一个“轨迹编号”维度运行模式里增加轨迹选择逻辑。第三外设联动。示教系统通常不只是三轴动还需要在特定点位触发气缸、真空阀、胶阀、相机拍照等。目前的DwellTime已经预留了这个空间但我建议单独建一个“点位动作表”用来配置每个点位的输出信号状态这样示教操作员可以在HMI上自由编辑不需要改PLC代码。可以说示教系统的核心是数据结构不是运动指令。指令只是执行者真正决定整套系统灵活性和扩展性的是点位数据怎么存、怎么管理、怎么让操作员方便地编辑和调用。6. 现场调试心得与最后提醒这套系统交付到客户现场之后我个人最深的体会是示教系统的开发难度不在写代码而在“现场工况的适配”。每个客户的工艺习惯不同对操作界面的要求也不同有的人习惯用摇杆有的人坚持用HMI方向按钮有的人希望示教速度能达到200mm/s快速走完然后精准微调有的人只想要“越慢越好别撞机就行”。所以如果你要复刻或者移植这套源码我最想说的三点是第一点位数据的防呆设计一定要做足。比如记录点位时要判断当前位置是否超出软限位如果在软限位之外直接拒绝记录并给HMI返回错误提示。不要等到运行的时候撞了机才发现点位越界。第二速度参数在HMI上一定要做成可调不要写死在PLC里。现场调试的时候操作员会根据实际工艺频繁调整运行速度如果每次都要连电脑改程序效率低到离谱。第三建议留一套手动“单步执行”功能。自动运行模式下可以一行一步走下去每一步停下来检查工艺效果是否符合预期。这个功能调试大有益处试想一下一整套轨迹跑完才发现第三点位置偏了又要改又要重新跑时间成本太高了。示教系统在自动化设备里只是基础功能模块但正是因为基础才值得把数据结构和操作流程打磨到位。一套好的示教框架能在未来接项目的时候直接复用省掉大量重复开发时间这比省那点设备硬件成本有价值得多。本文还有配套的精品资源点击获取