做机器人示教器这事儿,说难不难,说简单也不简单。最近我把一套“三菱FX3U + 昆仑通态触摸屏”的方案跑通了,实现了三轴联动的示教与自动运行。整个项目做完,我最大的感受是:用触摸屏脚本配合小型PLC做示教器,非常适合预算有限、结构简单、控制逻辑不复杂的场景。这篇文章把我从硬件选型到PLC程序、触摸屏脚本、调试踩坑的全过程记录下来,希望能给正在捣鼓类似项目的朋友省点时间。
1. 项目整体设计与方案选型
1.1 为什么用“PLC + 触摸屏”而不是专用示教器
发那科、安川这些专用机器人示教器,体验确实好,但价格摆在那。一套原装示教器加上控制柜,预算经常顶得上好几台小型设备。很多工厂的自动化改造项目里,设备只需要走几个固定轨迹,重复精度要求不高,用专用工业机器人属于杀鸡用牛刀。
我这次做的项目是给一台小型三轴搬运设备做示教功能。设备行程不大,X轴500mm、Y轴400mm、Z轴200mm,驱动用的是三菱MR-JE伺服,PLC是三菱FX3U-32MT,触摸屏是昆仑通态TPC7062Ti。这套组合的核心思路是:PLC负责实时运动控制和IO逻辑,触摸屏负责示教、点表管理和自动运行控制。
用PLC做运动控制,很多人第一反应是“能行吗”。FX3U本身不带运动控制总线,只能通过脉冲输出控制伺服。但FX3U有三个100kHz的高速脉冲输出口,Y0、Y1、Y2正好可以带三个轴。对于点位运动、直线插补这种精度要求不高的场景,脉冲方式完全够用。
1.2 系统架构与工作流程
整个系统分成三个层次:
- 操作层:昆仑通态触摸屏,负责坐标显示、手动点动、示教记录、点表编辑、自动运行监控。
- 控制层:三菱FX3U PLC,负责接收触摸屏指令,执行脉冲输出、回零、限位检测、报警处理。
- 执行层:三个伺服驱动器与电机,按照PLC发出的脉冲数量和频率精确定位。
示教器的工作流程是这样的:先在触摸屏上切到“手动模式”,用点动按钮把设备移动到目标位置,点“记录”保存当前坐标;重复操作记录多个点后,把这些点保存到点表里;然后切到“自动模式”,PLC按点表顺序执行,设备自动走一遍轨迹。如果中途需要修改某个示教点,直接在触摸屏上编辑坐标数值就行,不用重新走一遍。
这里有个非常关键的认知要提前说清楚:昆仑通态的脚本运行在触摸屏的CPU上,不是运行在PLC里。触摸屏脚本读取的是PLC寄存器的数值,通过Modbus协议或者三菱专用协议通信。所以,触摸屏脚本适合做数据管理、界面逻辑、状态判断这类“慢速”工作,不适合做实时的脉冲控制。实时的运动控制必须放在PLC里,用梯形图或ST语言实现。这个边界如果搞混了,项目大概率会翻车。
1.3 方案优势和潜在问题
这套方案的优势很明显:
- 成本低,不增加额外的硬件模块。
- 操作直观,不需要工人学习专业示教器的复杂菜单。
- 维护简单,触摸屏和PLC都是成熟产品,备件好找。
问题也有,主要集中在几个方面:
- FX3U的脉冲输出频率限制在100kHz,伺服电子齿轮比不能设太高,否则速度跟不上。
- 三轴联动不是真正的插补。FX3U的三路脉冲是独立输出的,虽然可以同时启动,但不会根据轨迹自动计算各轴速度。也就是说,直线斜线运动时,不是标准的线性插补轨迹,而是一段一段的“折线”。对于大多数点位搬运场景,这完全够用,但如果要做圆弧或精密轨迹追踪,就得考虑FX3U加配运动控制模块,或者换成FX5U。
- 触摸屏脚本的扫描周期不稳定,不能用于高速逻辑判断,只能做低优先级的数据处理。
2. 关键参数计算与核心细节解析
2.1 伺服电子齿轮比与脉冲当量计算
这是做整套系统最先要敲定的事。脉冲当量决定了PLC发多少个脉冲对应伺服走多远,直接关系到示教精度的标定。
以我用的三菱MR-JE伺服为例,编码器分辨率是131072脉冲/转(17位)。如果我设定丝杠导程为10mm,那么电机每转一圈,工作台移动10mm。这时候,PLC每发一个脉冲,伺服走多少距离,取决于电子齿轮比CMX/CDV。
脉冲当量计算公式:
- 伺服电机每转一圈需要的指令脉冲数 = 131072 × CDV / CMX
- 工作台每移动1mm需要的脉冲数 = 伺服电机每转一圈需要的指令脉冲数 / 丝杠导程
我实际设电子齿轮比CMX=131072,CDV=10000,这样每转一圈需要的指令脉冲数就是131072 × 10000 / 131072 = 10000个脉冲。丝杠导程10mm,那么每个脉冲对应0.001mm。也就是说,脉冲当量是1μm,PLC发10000个脉冲,工作台走10mm。
在触摸屏上做示教时,所有坐标值我都以毫米为单位显示,PLC内部寄存器存的是实际脉冲数,昆仑通态的脚本里做一次数值换算。这个换算逻辑不要放在PLC里,因为触摸屏修改坐标后要立即显示对应关系,放PLC还得来回读,容易出逻辑混乱。
2.2 PLC寄存器规划
三菱FX3U的D寄存器是16位的,但脉冲计数可能要超过32767,所以坐标值我用32位存储,每个轴占用两个D寄存器,低字和高字。我规划的寄存器地址如下:
| 项目 | 寄存器 | 说明 |
|---|---|---|
| X轴当前位置 | D100(低)、D101(高) | 32位脉冲数 |
| Y轴当前位置 | D102(低)、D103(高) | 32位脉冲数 |
| Z轴当前位置 | D104(低)、D105(高) | 32位脉冲数 |
| 当前示教点序号 | D110 | 1~100 |
| 点表总数 | D111 | 实际示教点数 |
| 运行状态字 | D120 | 0=停止,1=运行,2=暂停 |
| 指令字 | D130 | 触摸屏写入控制命令 |
| 示教缓冲X | D140、D141 | 当前要存入的X坐标 |
| 示教缓冲Y | D142、D143 | 当前要存入的Y坐标 |
| 示教缓冲Z | D144、D145 | 当前要存入的Z坐标 |
点表存储在PLC的D200开始的区域,每个点的X、Y、Z坐标占6个寄存器,连续存100个点就是600个寄存器。FX3U的D寄存器有8000多个,完全够用。这里不建议把点表放在触摸屏的组态里,虽然昆仑通态的配方功能可以做,但配方数据是存在触摸屏里的,一旦触摸屏故障或者换屏,所有数据都没了。把点表放PLC里,断电用电池保持,更换触摸屏不影响工艺数据。
2.3 昆仑通态脚本的分类与使用边界
昆仑通态的脚本分几类:启动脚本、循环脚本、窗口打开脚本、按钮脚本、事件脚本。我这次项目中,核心用到了循环脚本和按钮脚本。
循环脚本在触摸屏运行时周期执行,有点类似PLC的扫描程序。我把它用来做状态监控和点表显示刷新,每500ms执行一次。这地方有个经验:循环脚本的执行间隔不要设置太短,否则触摸屏的CPU占用率会飙升,界面操作卡顿。尤其是TPC7062Ti这种老型号,CPU性能有限,500ms是安全值。
按钮脚本是点击按钮时触发,我用来处理“记录示教点”“删除示教点”“插入点”“启动运行”这类一次性操作。按钮脚本的执行时机是用户点下按钮的瞬间,不占用循环资源,逻辑写起来也更清晰。
事件脚本是在某个条件满足时触发一次。我在项目里用它来处理PLC返回的报警信息,比如“伺服报警”“限位触发”“回零未完成”,一旦条件成立就弹窗提示并停止运行。注意,事件脚本的触发电平是“边沿”还是“状态”,在组态的时候要区分清楚。我用的是状态触发,条件成立就弹窗,但设置了弹窗去重标记,防止每次循环都弹。
3. PLC梯形图实现与三轴联动控制逻辑
3.1 回零与限位逻辑
设备每次上电后必须回零,否则位置坐标无法确定。三个轴的正负限位开关分别接在PLC的X0~X5上,回零传感器接X6、X7、X10。
回零逻辑我采用“快找+慢找”两段式:先以50kHz频率朝负方向快速移动,碰到回零传感器后停止,再以5kHz频率反向慢速离开传感器,等传感器信号消失后锁存零点。这样回零精度比单纯碰传感器再停止要高得多,重复精度大概能到±3个脉冲左右,换算下来就是±3μm。
梯形图的核心逻辑是:
步1:启动回零,先检测Z轴限位是否触发,未触发则以脉冲输出指令DRVI正向移动(Z轴向上为安全方向) 步2:Z轴到上限位后停止,回零完成标志位M10置ON 步3:依次对X轴、Y轴执行相同的“快找+慢找”操作 步4:三个轴全部回零后,M20置ON,通知触摸屏可以做示教了这里有一个很关键的细节:回零顺序必须先Z后X/Y。因为Z轴在最低位时,X/Y运动可能撞到下方的工件或者夹具,先把Z抬起来才安全。这个顺序在项目文档里一定要写清楚,我在调试时就因为顺序搞反,差点把夹具顶坏。
3.2 手动点动与示教记录
手动模式时,触摸屏上显示X/Y/Z三个轴的“正/负”点动按钮,按下移动、松开停止。PLC这边用PLSY指令或者DRVI指令做定长运动。
我的实现方式是:触摸屏按下点动按钮时,把对应轴的点动速度设定值写到D寄存器,并把点动使能位M30置ON;松开按钮时M30置OFF。PLC扫描到M30为ON后,用DRVI按设定频率连续发脉冲,直到收到停止信号或者限位信号。
示教记录的逻辑相对独立。操作流程是:
- 操作员用点动按钮把设备移动到目标位置。
- 在触摸屏上点击“记录当前点”按钮。
- 触摸屏脚本读取当前X/Y/Z坐标(D100~D105),写入示教缓冲D140~D145。
- 触摸屏脚本根据当前点序号(D110)把缓冲数据写入点表对应位置。
- 点序号自动加1,点表总数同步更新。
这里有个容易忽略的问题:坐标值是32位的,触摸屏读写时要注意高低字节的排列。昆仑通态和FX3U通信时,默认是低字在前、高字在后。我在脚本里读32位数据时,用的是“读D100,再读D101,然后按低字+高字合并”,写回去的时候同样要拆开。很多新手在这里会栽跟头,显示出来的坐标值忽大忽小,其实就是高低字顺序搞错了。
3.3 自动运行与三轴联动
自动运行是整套系统最核心的部分。PLC收到触摸屏的“启动”命令后,按点表顺序逐个执行。每个点的执行流程是:
- 读取当前点坐标。
- 计算当前坐标与目标坐标在各轴上的差值。
- 根据设备的运行速度要求,计算出各轴脉冲输出频率和输出时间。
- 三轴同时启动脉冲输出,等待所有轴到位后,再执行下一点。
我采用的梯形图方式是:先用ZRN指令回零确认原点,然后循环从点表中取出坐标数据,用DRVI指令对三个轴分别发脉冲。
DRVI是相对定位指令,指令格式是DRVI(S1)(S2)(D1)(D2),其中S1是输出脉冲数,S2是脉冲频率,D1是输出口地址。我用X轴做示例:
LD M50 // 自动运行启动标志 ANI M8029 // 上一次定位完成标志 DRVI D200 D300 Y0 Y004 // X轴移动到示教点,脉冲数在D200,频率在D300但三轴联动时有个问题:DRVI指令是单轴指令,三个轴同时发指令只能靠“同一扫描周期内,连续执行三条DRVI”。FX3U的高速脉冲输出是硬件实现的,三条DRVI同时激活后,三路脉冲在硬件层面被同步发出。实际上,由于PLC扫描周期的影响,三路脉冲的启动时间会有零点几毫秒到几毫秒的差异。对于点位搬运,这个时间差无关紧要,但如果你要做轨迹要求很高的应用,一定要认识到这个局限。
为了控制三轴运动的协调性,我设计了一个“主从联动”逻辑:
- 主轴(X轴)运动到目标位置需要的时间T = X轴脉冲数 / X轴频率。
- Y轴和Z轴按照相同的T时间来计算各自频率,公式是:从轴频率 = 从轴脉冲数 / T。
- 每条DRVI指令的脉冲频率都动态计算好,写入D寄存器。
这样处理的好处是:虽然三条轴不是真正的直线插补,但最终三个轴几乎同时到达目标点,设备在视觉上看起来是“联动”的,不像逐轴运动那样一顿一顿。实际运行效果,对于简单的搬运码垛,视觉上完全没有问题。
核心梯形图的顺序是:
- 从点表中读取第N点的X/Y/Z坐标到D200/D202/D204。
- 用减法指令SUB计算出与当前坐标的差值,结果存到D210/D212/D214。
- 用除法指令DIV计算各轴频率,分别写入D300/D302/D304。
- 连续执行三条DRVI指令启动三轴。
- 用M8029(定位完成标志)或者三轴各自的完成位做“全部到位”判断。
- 全部到位后,N加1,继续下一个点。
- 所有点执行完毕后,自动运行完成标志置ON,通知触摸屏。
3.4 速度倍率与加减速控制
示教器上必须要有速度倍率功能。我做了两种:手动点动倍率和自动运行倍率。触摸屏上放一个滑动滑块,范围10%~100%,滑块值写入D160。PLC在计算脉冲频率时,统一乘以倍率系数。
加减速控制方面,我使用的是三菱DRVI指令自带的加减速时间设定。通过D8340(X轴)、D8341(Y轴)、D8342(Z轴)设定加减速时间。我实际设定加减速时间都是100ms。这个值不能太大,否则设备会显得很“肉”;也不能太小,否则机械冲击大、特别是Z轴容易抖动。三轴负载不太重的话,100~150ms是比较舒服的范围。
4. 昆仑通态组态与脚本实现细节
4.1 画面布局设计
我做了4个画面:主画面、手动示教画面、点表管理画面、参数设置画面。
主画面显示设备当前工作模式、运行状态、三轴坐标、报警信息,以及模式切换按钮。手动示教画面是核心操作界面,包含三轴的点动按钮矩阵、当前位置显示、示教点序号选择、记录按钮、坐标微调输入框。点表管理画面用表格形式显示所有示教点的坐标,支持点击选择、修改、删除、插入。参数设置画面配置运行速度、回零速度、加减速时间等参数。
这里要注意:昆仑通态的表格控件操作起来不算顺手,数据量大时刷新会有延迟。如果点表超过50个点,不建议用表格控件做全量刷新,而是按“当前选中行”局部刷新,或者只显示当前编辑点的坐标。
4.2 脚本通信机制与寄存器读写
昆仑通态与FX3U通信使用的是内置的“三菱FX系列编程口协议”。通信参数默认是9600波特率、8位数据、偶校验、1位停止位。触摸屏组态时选择好PLC型号和通信协议即可。
脚本里读PLC数据用的是函数:
!ReadFromPLC(站号, 寄存器类型, 起始地址, 数据个数, 数据缓冲区名称)写PLC数据用的是:
!WriteToPLC(站号, 寄存器类型, 起始地址, 数据个数, 数据缓冲区名称)注意寄存器类型要对应,D寄存器用“D”,M寄存器用“M”,X输入用“X”。地址从0开始编号,所以在脚本里读写D100时,地址写“99”。
我写了一个读取三轴坐标并刷新显示的循环脚本,每500ms执行一次。脚本里先定义局部变量,然后读PLC数据到变量中,再把变量值赋给界面上的标签控件。
这里分享一个经验:昆仑通态的脚本变量分全局变量和局部变量。在循环脚本里尽量用局部变量,用完就释放,避免全局变量堆积导致内存碎片。TPC7062Ti的内存不大,脚本写多了、变量攒多了,长时间运行会越跑越慢,甚至黑屏重启。
4.3 手动点动与示教记录脚本
手动点动按钮的逻辑我拆成了按下和弹起两个状态。昆仑通态的按钮支持“按下脚本”和“弹起脚本”,正好对应点动的启动和停止。
按下脚本的逻辑是:
!WriteToPLC(0, "M", 30, 1, 1) // 写M30为ON,启动X轴正向点动 !WriteToPLC(0, "D", 159, 1, 0) // 点动速度设定为当前手动速度值弹起脚本就是把M30写成OFF。
这里有个操作小技巧:点动速度不要和自动运行速度混用同一个寄存器。手动点动速度一般设低一些,20mm/s左右,方便精确对位;自动运行速度设高一些,根据工艺需求可到200mm/s以上。如果只用一个速度值,做手动示教时经常会出现“点动太快,冲过头”的问题,最后示教出来的点全偏了。
示教记录按钮的脚本逻辑是:
- 从PLC读取当前X/Y/Z坐标到缓冲变量。
- 读取当前点序号D110。
- 根据点序号计算点表起始地址:起始地址 = 199 + (点序号-1) * 6。
- 把三个坐标值分别写入点表对应的6个连续寄存器。
- 点序号加1写回PLC。
- 刷新点表总数。
脚本里坐标写PLC时要拆成低16位和高16位。三菱FX3U的32位寄存器中,低字在前。脚本里要手工做位运算拆分:
// 假设coord是32位整数变量,value_low是低16位,value_high是高16位 value_low = coord % 65536 value_high = (coord - value_low) / 65536写入时先写低字再写高字,读的时候先读低字再读高字再组合。这个看似啰嗦的步骤,是保证坐标数据不出错的关键。我见过有的工程师图省事,用16位读写,结果坐标值一到±32767就跳变,现象就是设备走到一半自己开始乱跑。
4.4 自动运行控制脚本
自动运行按钮的脚本不负责运动执行,只做两件事:写指令字、监控状态。
点击“启动”按钮时:
!WriteToPLC(0, "D", 130, 1, 1) // 指令字=1,请求启动点击“暂停”按钮:
!WriteToPLC(0, "D", 130, 1, 2) // 指令字=2,请求暂停点击“停止”按钮:
!WriteToPLC(0, "D", 130, 1, 3) // 指令字=3,请求停止PLC梯形图对D130做解码,分别触发M50(启动)、M51(暂停)、M52(停止)三个标志。这样脚本和PLC的逻辑彻底解耦,脚本只管发命令、PLC只管执行命令,不会出现两边逻辑绞在一起的情况。
循环脚本里,我监控D120运行状态字。等于1时,界面显示“运行中”状态灯变绿;等于2时显示“已暂停”;等于0时显示“停止”。同时把当前正在执行的示教点序号和总点数显示出来,方便操作员了解进度。
4.5 速度倍率滑块与数据校验
速度倍率滑块用的是昆仑通态“滑动输入器”控件,绑定D160寄存器。范围设定为10~100。PLC侧读取D160的值作为倍率百分比,在计算脉冲频率时参与运算。
关于滑块的绑定方式,我建议不要直接绑定PLC寄存器,而是先绑定到触摸屏的全局变量,然后在循环脚本里把全局变量值写入PLC。原因很实在:滑动输入器拖动过程中的中间值变化非常频繁,直接绑PLC会导致通信总线拥堵,影响PLC实时响应。经过触摸屏变量中转后,可以加上“防抖”逻辑,比如数值变化超过2%才写一次PLC,这样通信负载低很多。
4.6 配方与点表保存方案
点表数据存在PLC的D200~D799,这些是电池保持区域。三菱FX3U的D寄存器默认大部分是锁存的,断电后数据不会丢失。但要注意一点:如果你在PLC程序里用了“初始化脉冲”(M8002),千万不要把它用来清零D200~D799。M8002只在PLC首次上电时ON一个扫描周期,如果程序里写了MOV 0 TO D200,那以后每次断电重启点表就全丢了。
我的做法是:点表清零操作只在触摸屏上通过“清除所有示教点”按钮触发,PLC程序里根本不做任何点表数据的初始化。这样即使PLC程序被重新下载,只要不清除保持区,点表数据还在。
5. 调试过程与常见问题
5.1 触摸屏与PLC通信异常
我调试时第一次碰到的问题是触摸屏上显示“通信超时”,所有数据都读不到。
排查思路先看接线。FX3U的编程口是圆头8针,昆仑通态TPC7062Ti的COM口是9针串口。接线要按“2对2、3对3、5对5”的标准直连方式。但很多二手线缆是按照“2对3、3对2”的交叉方式做的,这就导致通信不上。
另外要注意波特率设置。FX3U编程口默认波特率是9600,但有些PLC的程序被改过通信参数。我在调试时就用三菱GX Works2连接PLC,把PLC通信格式改成“9600,8,E,1”,触摸屏端也保持一致,问题解决。
5.2 坐标显示跳动
坐标显示出来之后,数字一直在跳,轻轻晃动都有几次脉冲的波动。这个现象是正常的。伺服电机在静止状态下,由于机械振动、负载扰动,编码器会检测到微小的位置波动,反馈到PLC的当前位置计数器里。
处理办法有两种:
- 在PLC侧做滤波,位置值在小范围内波动时不更新显示。
- 在触摸屏侧做显示滤波,监视值的变化量小于设定阈值就保持原显示。
我选了第二种,在昆仑通态的循环脚本里加了个比较逻辑,非常有效:
if abs(当前位置 - 上次显示值) < 5 then 显示值 = 上次显示值 else 显示值 = 当前位置 上次显示值 = 当前位置 endif这个阈值5就是0.005mm,肉眼完全感受不到,但画面稳定多了。
5.3 三轴联动时某轴“偷跑”
自动运行过程中发现,Y轴偶尔会提前启动,或者X轴还没到位,Z轴就开始动作了。这个问题的根因在PLC程序的扫描周期和DRVI指令的启动时刻不完全同步。
排查之后发现,问题出在我用了“同一扫描周期内执行三条DRVI指令”,但在某些情况下,某条DRVI的启动条件没有被同时满足,导致它推迟到下个扫描周期才执行。例如,某个轴的当前位置计数器有轻微的“回差”,导致差值计算不为零但绝对值小于脉冲输出许可值。
解决办法是,在三轴启动前增加一个“就绪判断”:分别计算三个轴的目标脉冲数与当前位置差值的绝对值,如果三个差值都大于设定的最小脉冲数(比如10个脉冲,即0.01mm),才允许启动。这样从逻辑上保证了三条DRVI指令在同一周期内可以被同时触发。
5.4 点表数据丢失
用户反馈有时候点表数据保存后,断电重启就没了。我查了一下,不是PLC电池的问题,而是操作员在使用触摸屏时,误触了“系统设置”里的“恢复出厂设置”,触摸屏恢复默认后,虽然配方数据不在了,但PLC里的点表还在。后来我在触摸屏脚本里加了一个“数据备份”功能,点表修改后自动上传一份到触摸屏的存储目录里。
触碰屏内部存储的数据在掉电后不会丢失,这块可以做一个备份机制。PLC里的点表是“主存储”,触摸屏目录里的CSV文件是“备份存储”。一旦检测到PLC点表数据异常(比如总数不对),就提示操作员从备份恢复。这个功能做起来很简单,但对用户来说却是救命级别的保护。
5.5 Z轴抖动
Z轴垂直安装,断电或者运动停止后有下垂现象,运动过程中有明显抖动。这其实是机械问题,伺服增益没调好的典型表现。MR-JE伺服可以通过面板或者软件调整位置环增益和速度环增益。
我调整后试下来的经验是:Z轴因为有重力的影响,增益要比水平轴低一些,否则容易振荡。位置环增益降到原来的70%左右,速度环积分时间常数拉大一点,抖动基本消除。另外机械上,Z轴有配重或者氮气平衡的话,伺服能轻松很多。这个项目里没有平衡装置,调试时就得靠伺服参数来补偿。
6. 一些值得说的体会
这个项目从设计到调试完成,大概花了两周时间。和专门的机器人示教器相比,这套方案在功能上有各种局限,但在“点位示教、顺序搬运、简单轨迹”这类场景中,性价比确实很高。
最后分享一个心得:做这种项目,别急着写程序,先把“数据流”理清楚。触摸屏上按一个按钮,数据经过什么路径、最终落在哪个寄存器、PLC怎么响应,这一条链路在动工前画出来,后面能省一大半时间。我就是因为前期没画清楚,中途改了两次寄存器地址,差点把点表数据搞乱。
还有一点,示教功能做完后,一定要让操作工实际用几天再交付。他们用起来觉得顺手的,才是真正好用的示教器。我就根据他们反馈,增加了“点动短行程”模式,按下按钮移动0.1mm,松开就停,这样精确微调特别方便。这个需求如果不上现场,靠坐在办公室里是想不出来的。