ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

汇川PLC三轴示教系统:点表设计、伺服控制与状态机实现

2026/9/1 6:18:15 拓冰建站 浏览量
汇川PLC三轴示教系统:点表设计、伺服控制与状态机实现 简介面向汇川H5U系列PLC与MCGS触摸屏开发者的三轴示教系统源码适合工业自动化、PLC编程及触摸屏开发场景支持离线仿真可快速上手并用于二次开发。压缩包共3个文件包括inscode工程配置、index.html界面文件与.gitignore过滤规则整体仅7KB精简但结构清晰便于导入开发环境后直接查看和修改。源码注释详尽本身便是一份扩展指南并围绕示教点录入的异步处理、三轴直线插补参数设置、仿真模式数据处理、运动模式扩展方案以及通讯故障排查给出了可落地的实现思路同时这套系统亦可作为通用三轴控制模板按需移植到点胶、焊接、搬运等自动化设备中。目前已有57人学习对需要掌握汇川H5U运动控制与MCGS界面联调的开发者而言是一份轻量且实用的参考。1. 项目概述与方案选型1.1 这个项目到底解决什么问题三轴示教系统说穿了就是让一台XYZ三轴运动平台学会走一遍固定轨迹然后把轨迹存下来以后让它自动重复。这在小型的点胶机、锁螺丝机、焊锡机、搬运码垛机上非常常见。你没看错现在市面上很多非标设备的核心其实就是这套东西——人工拖或者摇着手轮走一遍路径PLC把点位记下来自动运行的时候按顺序走这些点配合IO输出控制胶枪、螺丝批或者焊笔的动作。这个项目用汇川的PLC来落地而且带了源码对搞非标自动化、做设备集成、或者正在学汇川运动控制的工程师来说是个非常适合拆解参考的完整案例。它不是什么高大上的AI视觉引导也不是复杂的轨迹规划它就是一个通用点位示教轨迹复现的标准模板但恰恰是这种基础框架能覆盖掉现场一大半的真实需求。1.2 硬件方案怎么定先别急着看代码硬件选型才是决定这套系统好不好用的第一步。三轴平台本身大家都懂关键是控制器和伺服怎么搭。汇川这边做三轴点位示教主流的方案有这么几条路线方案控制器伺服方案特点方案AH5U IS620N伺服EtherCAT总线接线少扩展性好程序里用轴控指令比较顺手方案BAM401/AM402 IS620NEtherCAT总线老牌运动控制PLC资料多适合做复杂运动方案CEasy系列 脉冲伺服脉冲方向控制成本最低适合点位少、精度要求不高的场景我做这个项目的时候用的是H5U加IS620N伺服走EtherCAT总线。选它的原因很直接第一H5U内置EtherCAT主站带三根轴不需要额外加运动控制卡或者总线耦合器硬件成本压下来了第二InoProShop这个编程软件集成了PLC和伺服调试一个软件搞定逻辑和伺服参数配置现场调试少带一个调试器第三H5U支持IEC 61131-3标准的ST、梯形图、SFC等语言我做点位示教这种带有数据结构操作的逻辑用ST写起来比梯形图舒服太多了。1.3 为什么选汇川这套组合其实做示教系统市面上很多方案是用触摸屏的配方功能去存点位的。比如威纶通触摸屏直接内置了点位示教控件配合PLC的MODBUS寄存器就能实现简单的示教存储。但为什么我最后还是决定自己用PLC源码实现原因在于触摸屏配方的模式有几个绕不开的坑。一是点位数量有限屏的配方区是按固定行数做的做多了麻烦二是点位坐标的读取存在通信延迟你手动移动轴的时候屏上显示的位置和PLC实际的值有偏差存下来的点可能差那么一点点三是速度和IO输出时序的联动控制用屏的配方来实现很别扭。自己在PLC里实现示教逻辑坐标数据直接存在PLC的掉电保持区读的是伺服的实际位置IO输出的时序可以在梯形图里精确控制整套逻辑跑下来非常顺手。这就是我这个项目的核心决策示教的灵魂在PLC不在屏。2. 核心数据结构与程序框架2.1 点表结构设计写示教系统源码第一件要设计的事情不是程序流程而是数据怎么存。点位数据是整个系统的血液每存一个点至少要包含坐标、速度、IO动作、等待条件这些信息。我在源码里定义的数据结构大致是这样的// 点位数据结构 TYPE POINT_RECORD : STRUCT X_POS : LREAL; // X轴坐标单位mm Y_POS : LREAL; // Y轴坐标单位mm Z_POS : LREAL; // Z轴坐标单位mm RUN_SPEED : REAL; // 该点的运行速度百分比 IO_OUT : BYTE; // IO输出状态bit0~bit7对应Y0~Y7 WAIT_TIME : UINT; // 到达该点后停留时间单位ms IS_END : BOOL; // 是否轨迹结束点 RESERVED : BYTE; // 预留字段 END_STRUCT END_TYPE这里强调几个设计考量。坐标用LREAL双精度浮点是因为在ST里做毫米和脉冲的转换计算时REAL单精度在大坐标值下会有累积误差用双精度稳一点。RUN_SPEED存放在点位里是为了让程序在运行的时候能切换不同的速度比如接近工件的时候慢速空跑的时候快速这样既能保护机械又能提高节拍。IO_OUT这个字节很关键它把走到这个位置要做什么动作和轨迹本身绑定在一起了这样在自动运行时PLC可以根据当前点位直接输出对应的Y端子信号控制胶枪开关、电磁阀通断等完全不需要额外写散乱的IO逻辑。2.2 示教模式与自动模式的程序架构整套PLC程序我分成了三个大的程序块示教管理程序、轨迹运行程序、IO与报警处理程序。这三个块在PLC的扫描周期里循环运行但通过一个系统状态变量来切换工作模式。状态变量我设计的是一个枚举类型TYPE SYS_MODE : ( MODE_MANUAL : 0, // 手动模式点动各轴用于示教对位 MODE_TEACH : 1, // 示教模式记录当前坐标为点位 MODE_AUTO : 2, // 自动模式按点位表自动运行 MODE_HOME : 3, // 回零模式执行回原点流程 MODE_ALARM : 4 // 报警模式触发急停或故障 ); END_TYPE这个模式切换是整个系统的总闸。手动模式下触摸屏上的点动按钮直接控制伺服的点动脉动速度是固定低速方便精确对位。示教模式下每按一次记录点位PLC就把三轴的当前实际位置连同当前设置的速度、IO状态、停留时间打包写入点表的下一个空位。自动模式下程序自动按顺序加载点表里的点并依次执行。这样设计的核心逻辑是状态分离——手动、示教、自动三个动作的代码在物理上分开互不干扰在调试的时候出问题也好定位。我见过很多新手喜欢把模式切换写成一个巨大的IF嵌套最后出问题的时候连自己都绕不进去。2.3 轴控制指令和伺服使能的处理H5U控制IS620N伺服在InoProShop里的轴控指令主要用MC_Power使能、MC_Home回零、MC_MoveAbsolute绝对定位、MC_MoveVelocity速度运行这些标准运动控制指令。有一个细节比轴控指令本身更重要就是伺服使能的处理。示教系统里人员在机器旁边走来走去随时可能碰到急停如果程序里做的使能逻辑不到位伺服一掉使能轴就会溜车或者产生冲击。我的处理方式是做了一个软使能保护逻辑只有当急停信号(硬IO)不复位、安全门信号正常、且当前没有报警时MC_Power的Enable输入才允许为TRUE。任何异常都会让使能断开。同时伺服驱动器的SON信号与PLC输出的继电器回路做了硬串联确保PLC程序挂了、驱动器也能独立断开使能。这是现场安全的基本底线不能省。3. 示教功能的实操实现3.1 坐标读取示教的核心手感问题示教系统的使用者最常见的操作是什么把轴摇到想要的位置按一下记录按钮。听起来很简单但如果坐标读取的时机不对存下来的点和实际位置就差之毫厘谬以千里。我源码里坐标读取用的是H5U的轴当前位置对象比如MC_Power状态下的Axis.NcToPlc.ActPos。这个是伺服编码器的实际位置反馈不是指令位置。为什么要用实际位置而不是指令位置因为在低速点动或负载较重的情况下指令位置和实际位置会有跟随误差如果你存的是指令值那示教的时候看起来对得准实际跑的时候会偏。用实际反馈位置存下来的就是伺服真实到达的位置误差就小很多。另外读取坐标的时刻也要处理得讲究一点。我是在按钮信号的上升沿先做了一次防抖延时建议100~200ms等轴完全停下来之后才读取坐标。原因很朴素你手松开机按钮的一瞬间机械还没完全静止如果这时候立刻读坐标那个位置和最终静止位置可能差一两毫米。在现场你感受不到但在精密点胶上这就是废品了。3.2 速度处理和示教移动示教的时候人要在机器旁边摇轴速度控制非常影响体验。这里我推荐的做法是点动模式只允许用速度模式不能用绝对定位方式移动。什么意思呢点动按钮按住轴就以设定的速度持续运动手松开就停。这样最符合人的直觉。如果按一下按钮就固定走一段距离操作人员在离工件很近的时候很容易撞上去。而在InoProShop里点动我用的是带速度输入的MC_MoveVelocity指令速度值由触摸屏上的点动速度数值框控制默认设成10~20mm/s对绝大多数示教场景都够用了。这里要特别提醒一个H5U的坑MC_MoveVelocity指令在启动和停止的时候加速度和减速度是由轴参数里的加加速参数决定的。把加速度参数调太大会导致机械冲击调太小又感觉肉腾腾。我实测下来对常见的皮带模组和丝杆模组加速度设置在500~800mm/s²比较合适再结合负载惯性比去做微调手感会好很多。3.3 点位记录的完整流程记录一个点位的操作流程在触摸屏上做成了两步操作第一步先在上方的参数设置区填好目标速度IO输出状态停留时间这些会作为下一个点位的属性值。第二步按下记录点位按钮系统把当前坐标和刚才填的参数打包存入点表同时点位编号自动加一。这个流程看起来简单但我在代码里加了一个点位防覆盖的逻辑只有在示教模式下记录按钮才有效手动模式下误触记录按钮是不会写入数据的。这样防止了现场员工在不熟悉操作的时候误改了程序的点位。点位的存储空间我预留了200个对于三轴的小型设备完全够用。存储区域放在PLC的掉电保持区断电重启数据不丢。4. 自动化运行逻辑与控制流程4.1 从示教到自动运行的切换流程当点表记录完毕接下来要切换到自动模式运行。这块其实是整套系统在生产现场最常被考核的部分——稳定性。自动模式的启动流程是这样的// 自动模式启动流程伪代码 IF mode MODE_AUTO THEN // 第一步检查各轴是否已回零 IF NOT is_homed[0] OR NOT is_homed[1] OR NOT is_homed[2] THEN Alarm(ALARM_NOT_HOME); RETURN; END_IF // 第二步检查点表是否为空 IF current_point_count 0 THEN Alarm(ALARM_POINT_EMPTY); RETURN; END_IF // 第三步开始自动循环 step : 0; auto_running : TRUE; END_IF第一道检查是回零状态第二道是点表是否为空。这两个检测如果不过自动模式根本起不来。这能挡掉一大半因为误操作导致的运行异常。自动运行的循环逻辑我用的是步进式状态机每一个步骤代表一个点位的执行周期CASE auto_step OF 0: // 等待自动启动信号准备加载第0个点 IF auto_running THEN LoadPoint(0); auto_step : 1; END_IF 1: // 执行定位 MC_MoveAbsolute(axis_x, point_table[pt_index].X_POS, point_table[pt_index].RUN_SPEED); MC_MoveAbsolute(axis_y, point_table[pt_index].Y_POS, point_table[pt_index].RUN_SPEED); MC_MoveAbsolute(axis_z, point_table[pt_index].Z_POS, point_table[pt_index].RUN_SPEED); auto_step : 2; 2: // 等待到位 IF InPosition(axis_x) AND InPosition(axis_y) AND InPosition(axis_z) THEN // 输出IO动作启动停留计时 Y0_OUT : point_table[pt_index].IO_OUT.0; Y1_OUT : point_table[pt_index].IO_OUT.1; wait_timer(IN : TRUE, PT : point_table[pt_index].WAIT_TIME); auto_step : 3; END_IF 3: // 等待停留结束切换下一个点 IF wait_timer.Q THEN pt_index : pt_index 1; IF point_table[pt_index].IS_END THEN auto_running : FALSE; auto_step : 0; ELSE LoadPoint(pt_index); auto_step : 1; END_IF END_IF END_CASE这套状态机的好处是每个步骤职责清晰后续要加功能比如每个点做两次重复、或者中途暂停都在对应步骤里扩展就行不会破坏整体框架。4.2 到位判断的细节处理到位判断是整个自动运行里最容易被忽视又最能影响设备寿命的地方。很多新手的做法是直接看MC_MoveAbsolute的Done信号——到了才置位。但实际伺服运动里MC_MoveAbsolute在减速结束、位置到达后触发Done这没问题但频繁的起停会让机械结构非常受力。我实际用的是到位窗口判断给每个轴设置了一个允许的到位误差范围比如X轴正负0.05mmY轴正负0.05mmZ轴正负0.03mm当三轴的实际位置都落在目标点周围的这个误差窗口内并且位置误差的变化率已经很小即速度接近零就判定为到位。这样的好处是如果设备上有轻微的机械抖动在窗口内抖动不触发报警如果要追求高速可以在适当扩大窗口的前提下提升移动速度让设备在差不多到了的时候就开始执行IO动作节省节拍。当然到位窗口也不能设得太宽否则会影响精度。对一般的点胶和锁螺丝设备正负0.1mm以内的窗口比较合理。4.3 回零逻辑三轴系统的回零逻辑是自动运行的前置条件很多人把它当成简单的事其实这里坑不少。H5U里面做MC_Home回零我用的是当前位置设定为零点的方式即定义当前位置为原点同时配一个硬件原点开关做辅助判断。实际上在生产现场我建议用减速开关Z相脉冲的标准回零方式这样每次回零的重复精度最高。但如果机械结构上没有安装回零开关那就只能用当前位置设零的方式这个情况下一定要在设备上做软限位保护防止轴跑出去撞机械极限。我在源码里就是三轴都用软限位位置超过设定范围立刻报警停机。5. 常见问题与调试心得5.1 伺服使能冲突和报警处理做汇川伺服调试的时候很多工程师都会遇到使能冲突报警。这个报警在IS620N上非常典型你在InoProShop的调试面板里手动给伺服使能了然后PLC程序一运行MC_Power也尝试使能两边的使能信号打架驱动器直接报冲突。这个问题我踩过一次之后学乖了总结下来的经验是PLC程序和调试软件不能同时对同一个轴执行使能操作。你在调试面板里确认使能之后要在面板里先断开使能再运行PLC程序。反过来也一样。如果已经报使能冲突先把程序切到手动模式断开程序侧使能再在调试面板里复位报警。5.2 点位记录偏了怎么办示教完跑了几次发现某几个点位的实际位置总是和示教的时候差了一点。这个问题排查顺序很重要我按经验列一下优先级先看伺服是否在运行过程中发生过报警、丢步。如果伺服报警过轴的绝对位置可能已经被重置或者偏移了这时候需要重新回零再跑一遍。检查机械间隙。皮带传动的模组如果涨紧度不够正反向走同一个位置时会有回程间隙这时候示教点和实际到位点必然有偏差。可以用千分表打一下同一个位置的来回重复精度通常正反向误差超过0.1mm就要紧皮带或者考虑换丝杆结构了。检查PLC的扫描周期和轴控指令是否在同一个任务里。H5U默认的轴控任务需要放在一个固定周期任务里比如1ms或2ms如果程序写在普通任务里轴控指令的执行时间会有波动后续逻辑的时序也不稳定。这是我遇到过的一个隐蔽问题。5.3 触摸屏通信偶尔断开怎么办在实际运行中触摸屏和PLC的通信偶尔会断开尤其是在示教模式下高频读取轴位置的时候。这个问题根源往往是通信负载过大——屏幕上每个数值框都在高频刷新加上示教界面同时显示三个轴的实时位置MODBUS或者以太网的通信报文过多触摸屏的CPU处理不过来。解决的办法很实用给示教界面的坐标显示加上500ms刷新或者手动刷新模式。示教的时候操作人员不需要实时看到位置变化点位记录后自动刷新一次坐标显示就够了完全没有必要实时刷新。运行的时候坐标显示的刷新频率可以适当高一点但也不需要超过100ms。这样一通优化之后触摸屏通信明显稳定了。5.4 关于InoProShop的调试小技巧最后分享一个InoProShop里非常实用的调试技巧就是在线监控强制变量。示教系统调试点位记录逻辑的时候我经常需要模拟按下了记录按钮这个动作。如果每次都在触摸屏上点来回跑很烦。直接在InoProShop的监控窗口里把某个临时BOOL变量强制成TRUE再拉回FALSE就模拟了一次按钮按下。配合断点监控可以很清楚地看到点位表格里的写入过程。另外InoProShop的在线追踪功能也很值得一用它可以记录轴的指令位置和实际位置曲线排查跟随误差和到位窗口的问题非常直观。我之前一直怀疑某个轴的到位信号判断时机有问题用追踪一看发现实际位置曲线在目标位置附近有轻微的振荡导致到位窗口判断一直处于临界状态后来把轴的速度环增益稍作调整问题就消失了。这种问题光看程序是看不出来的必须靠波形去定位。三轴示教系统的源码工程在实际部署中还可以按设备类型灵活扩展——比如增加一个IO输出用于控制真空吸盘、增加一个输入点用于检测是否夹取到位或者把点表逻辑升级为支持多配方切换一套程序管多个产品型号的轨迹。这些扩展的骨架在这套点表加状态机的框架里都留好了口子。本文还有配套的精品资源点击获取