首页 / 资讯中心 / 文章详情

三菱PLC变址寄存器实现螺丝机配方管理,换型不再改程序

三菱PLC变址寄存器实现螺丝机配方管理,换型不再改程序 ★ FEATURED ARTICLE
做三轴螺丝机项目最让我头疼的不是走位精度也不是电批扭矩反而是配方管理。第一版程序就写了四种产品型号直接拿比较指令一段段选参数等客户说要加第五个型号我发现光梳理坐标就得翻小半个程序。后来我用三菱PLC的变址寄存器把配方管理重写了一遍思路彻底换了过来——加型号不再需要改PLC程序只需要在触摸屏上往空的配方槽里填参数。这篇就把当时从踩坑到理顺的完整过程记录下来给还在用“笨办法”写配方的朋友一个参考。1. 螺丝机换型换的不只是产品还有一整套参数1.1 三轴螺丝机的动作循环与配方参数清单三轴螺丝机的工作循环其实不复杂产品放到夹具里X/Y轴把电批定位到第一颗螺丝上方Z轴快速下降到一定深度后切换慢速电批接触螺丝并启动达到扭矩或圈数后停批Z轴抬起X/Y移到下一颗螺丝位置重复直到整块板子打完。问题在于“下一颗螺丝在哪”和“用什么扭矩打”这跟产品型号强相关。A型壳体4颗螺丝B型壳体6颗螺丝C型壳体有8颗而且螺丝规格不一样扭矩转速都不同。有的产品还要分两次下压先预锁后终锁。这些参数归纳起来就是一组“配方”螺丝数量、每颗螺丝的X/Y/Z坐标、扭矩上限、拧紧转速、Z轴快进深度、Z轴慢进深度、电批启动等待时间。真正常用的参数项算下来十几个到二十几个字不等。坐标一般按脉冲数存因为我们走的是步进或伺服发脉冲控制不换算成毫米调试的时候示教一下当前脉冲值直接写进配方直观又不容易错。1.2 不用变址寄存器之前我的配方切换代码第一版程序我犯了绝大多数新手都会犯的毛病——把配方做成“开关”。X0到X3当作产品选择信号然后每个产品写一大段MOV产品1号把D1000开始的坐标和参数搬到当前运行区。 产品2号把D2000开始的坐标和参数搬过来。 产品3号把D3000开始的坐标和参数搬过来。一个产品8颗螺丝坐标24个字加上扭矩转速一堆参数一条MOV只能搬一个字一个产品就是几十条指令。四个产品下来程序里光搬运就占了几百条。表面上能用实际维护很痛苦第一新增产品要复制粘贴一大段改错一个D地址坐标就乱了 第二改某颗螺丝的坐标得先找到是哪个产品的哪一段眼花是常态 第三程序扫描周期被一堆MOV拖慢动作程序被挤在后面响应变差。客户说“下周加三个新型号”的时候我意识到这条路走不通了。1.3 从“给每个型号写逻辑”到“用配方号驱动逻辑”后来我换了个视角配方表本质上就是一张二维表行是配方号列是参数。程序要做的只有一件事——根据当前配方号把对应那一行的数据整行搬到运行区。就像图书馆管理员按编号去书架上拿一本书不需要为一本书专门修一条路。这就需要PLC能“按计算出来的地址去取数”也就是变址寻址。有了这个能力无论配方表里是4个型号还是60个型号程序逻辑始终只有一套校验配方号、算偏移量、批量搬数据。这也是我这个项目里最核心的思路转变。2. 变址寻址D5000Z0这种写法本质是给PLC加了个数组下标2.1 V/Z寄存器到底怎么用三菱FX系列PLC里有两组变址寄存器V0到V7Z0到Z7一共16个。它们本身不存业务数据专门用来“改地址”。写法很简单看一个例子MOV K10 Z0 // 把10放进Z0 MOV D5000Z0 D200 // 这行指令实际访问的是D5010D5000Z0的意思就是“D5000这个基地址加上Z0里面的值”。Z0等于几实际地址就是D5000加几。这个“加”发生在指令执行的那一瞬间Z0不变所有用到D5000Z0的指令都会自动跟着偏移。这跟C语言里的数组下标完全是一个道理arr[3]就是base地址加3个元素的偏移量。2.2 变址寻址的本质是数组下标运算有了变址寄存器配方管理的核心公式就出来了基地址 配方存储区的起始D地址偏移量 配方号 × 单个配方占用的D字数实际地址 D(基地址) 偏移量写成D5000Z0只要单个配方的长度固定配方号从哪号开始偏移量就是可计算的一一映射。我在程序里先把配方号乘上40结果放进Z0然后D5000Z0自然就指向了第N号配方的第一个字。这个映射关系是整个配方管理的命脉后面所有流程都围着她转。2.3 为什么16位偏移对这个场景足够用FX3U的V/Z寄存器都是16位最大能表示32767的正偏移。我们的配方库假设60个配方每个40字最大偏移是59×402360远小于32767。所以完全用16位指令处理不需要考虑32位变址的组合用法。也有朋友问万一配方数量扩到很大怎么办我的建议是先看D区总量。FX3U的D区一共8000个字你不可能把整个D区都拿来做配方库还要留坐标示教缓冲、运动控制数据、通信缓冲等。按常规设备几百个配方已经算很多了16位偏移妥妥够用。如果哪天真超出范围再研究V和Z组合成32位偏移的用法那个属于极端场景一般项目碰不到。3. 配方存储区规划先画好表格再想怎么写程序3.1 数据区整体分配方案写代码之前先把D区当成一张Excel表来规划。我用的FX3U分配方案如下地址范围用途长度D0当前配方号运行中1字D100HMI配方号输入框1字D200-D239当前运行参数区40字D240-D279配方切换暂存区40字D300-D339HMI配方编辑区40字D5000-D7399配方存储区60个配方×40字2400字D7400-D7999备用扩展600字这些区域各有各的职责。D200区是动作程序唯一读取的参数来源所有轴走位、电批扭矩都从这一块拿数据。D300区是触摸屏的编辑缓冲区客户在屏上改配方时改的是这里。D5000区才是真正的“配方库”长期保存着所有型号的参数。这里有一个关键原则配方存储区的内部结构和D200运行区、D300编辑区完全一致。第0个字是配方编号第1个字是螺丝数量第2个字是扭矩上限……每个区的40个字含义一一对应。这样才能实现整行BMOV一键拷贝不用穿来穿去地对字段。3.2 单个配方的内部结构设计单个配方固定占40个字。前7个字是通用参数中间24个字是8颗螺丝坐标预留最后9个字留给扩展和校验位。具体如下相对偏移参数说明0配方编号写入时自动填入用于校验1螺丝数量最大8颗实际打多少由这个值控制2扭矩上限电批扭矩设定值3拧紧转速电批转速设定值4Z轴快进深度从起始位置快速下降的深度5Z轴慢进深度接近工件时切换慢速的深度6拧紧等待时间电批启动后的延时判定10到33第1至第8颗螺丝坐标每颗3个字X/Y/Z脉冲值34到39预留/校验字可存校验和或产品名编码为什么固定40字而不按实际螺丝数量动态变化因为固定长度才能用“行号×行宽”直接算偏移。如果每个配方长度不一样程序就得先扫描一遍找每一行的起点麻烦得多。把8颗螺丝坐标全部预留出来是一种“空间换简单”的做法实际只有4颗的型号空间稍微浪费一点但程序逻辑大幅简化非常划算。3.3 结构一致性原则工作区、编辑区、存储区完全同构这个原则我想多说几句。D200、D300、D5000三个区内部布局必须一模一样。比如D20010是当前运行的第一颗螺丝X坐标D30010就是HMI编辑区的第一颗螺丝X坐标D500010就是配方存储区某个配方的第一颗螺丝X坐标。这样做的好处是无论是从存储区搬到运行区还是从存储区搬到编辑区都只需要一条BMOV指令一个字都不用单独处理。很多工程师栽在“只搬参数忘了搬坐标”或者“字段位置记反了”上根源就是三个区的布局不一致。如果你现在要改配方结构也记住同步改三个区千万不要只改其中一个。4. 配方管理三套核心流程写库、读库、换型应用4.1 配方号校验与偏移量计算配方管理的总入口是D100这个字由触摸屏输入代表客户想操作哪个配方号。任何流程开始前先做范围校验。配方号允许的范围是0到59同时必须大于等于0。校验结果放在M50里范围外直接切断后续操作。校验方式和偏移计算如下// 配方号范围校验 LD D100 K59 // 如果 D100 59 AND D100 K0 // 且 D100 0 OUT M50 // M50 配方号有效 // 偏移量计算 MUL D100 K40 D10 // D10 配方号 × 40 MOV D10 Z0 // Z0 偏移量MUL的结果是32位低16位存在D10高16位存在D11。由于最大偏移只有2360D11永远为0直接用D10就行。校验和偏移计算是公用的写库、读库、换型应用三条流程都从这里起步。这样要改单个配方长度只需要改K40这一个常数全程序都跟着变不用到处找。4.2 HMI存配方从编辑区搬到存储区客户在触摸屏上改好D300-D339的参数后点“保存到配方库”HMI置位M100。PLC侧的逻辑是// 写入请求入口 LD M100 // HMI请求 AND M50 // 配方号有效 ANI M101 // 忙标志上次还没完成 ANI M0 // 设备不在运行中才开始写入 SET M101 // 置忙防止重复触发 // 整行搬送编辑区 - 配方存储区 BMOV D300 D5000Z0 K40 // 强制写入配方编号到第一个字作为数据头校验 MOV D100 D5000Z0 // 写完回读比较防止写入异常 MOV D5000Z0 D20 CMP D100 D20 M520 // 相等时M520导通 // 结束 RST M100 RST M101 SET M102 // 写入完成标志HMI可检测写入完成以后配方库中对应那一行就是HMI编辑区当时的内容。D5000Z0的Z0还是之前算好的偏移所以这条BMOV搬送的正好是“配方号×40”对应的存储位置。这个“整行搬送”就是变址寄存器最出彩的地方——一行代码替代了几十行MOV。4.3 查询与加载把存储区数据读回编辑区客户想看看某个配方里参数是什么或者想基于某个旧配方做新配方就需要把存储区的数据装载到编辑区。逻辑和写入正好反过来LD M110 // HMI“读取配方”请求 AND M50 ANI M101 SET M101 // 校验配方是否已建立 CMP D100 D5000Z0 M520 // 存储区第一个字应等于配方号 ANI M520 PAGE M530 // 不一致则报“配方未建立” // 整行搬送配方存储区 - HMI编辑区 BMOV D5000Z0 D300 K40 RST M110 RST M101 SET M112这个流程里有一个容易被忽略的细节先做配方号一致性检查。如果某个配方槽从来没写过D5000Z0那个位置可能是0而D100是5CMP必然不相等。这时候不搬数据直接提示客户“该配方未建立”避免客户看到一堆零还以为参数本来就没有。4.4 应用配方存储区搬到运行区运行中禁止切换真正开始生产前的换型动作是把选中的配方搬到D200运行区。这个流程多了两道保险LD M120 // HMI“应用配方”请求 AND M50 ANI M101 ANI M0 // 设备运行中禁止切换 SET M101 // 先搬到暂存区D240避免直接写运行区 BMOV D5000Z0 D240 K40 // 校验暂存区数据头 MOV D240 D21 CMP D100 D21 M520 // 校验通过后整行拷贝到运行区 BMOV D240 D200 K40 RST M120 RST M101 SET M122为什么先搬到D240暂存区再搬到D200因为D200是动作程序每时每刻都在读的区域。PLC的正常扫描周期内BMOV执行完之前动作程序不会读到一半的数据所以理论上直接搬也没事。但有中断程序、定位模块或高速处理场景时万一正在读坐标读到一半数据就乱了。而且按我个人的习惯设备安全和数据一致永远不怕多一道保险。暂存区的成本只是一个D区尺寸换来的是绝对的稳定。5. BMOV批量搬送与运行时的安全互锁5.1 用BMOV一次搬40字配合Z0完成整行拷贝三菱的BMOV指令作用是把源地址开始的N个字一次性搬到目标地址开始的N个字。配合变址寄存器Z0就成了“把第N号配方整行搬走”的利器。BMOV D5000Z0 D200 K40 // 从第(5000Z0)个地址开始搬40字到D200 BMOV D300 D5000Z0 K40 // 从D300搬40字到第(5000Z0)个地址BMOV源和目标都支持变址所以同一行的搬运方向相反也只是改一下前后位置。要注意的是源和目标不能有地址重叠。我们的配方库在D5000以后运行区和编辑区在D200、D300完全错开没有任何重叠风险。如果是其他项目把编辑区和存储区放在相邻位置就要小心重叠问题严重的话会导致数据被循环改写。还有个细节BMOV传送点数K40最大不能超过512。配方长度超过512的情况基本不存在但如果你的配方设计得很长记得分多段搬送或者改成循环逐字搬运。5.2 坐标读取代码按当前螺丝号动态取坐标配方数据搬进D200运行区之后动作程序怎么用这些坐标这也是变址寄存器的一个典型应用场景。当前正在打第几颗螺丝这个序号放在D450里从0开始计数比如第0颗、第1颗……第7颗。MUL D450 K3 D451 // 坐标偏移 当前螺丝号 × 3 MOV D451 Z1 // 放进另一个变址寄存器 MOV D207Z1 D460 // 取X坐标D460为目标 MOV D208Z1 D461 // 取Y坐标 MOV D209Z1 D462 // 取Z坐标D207是D200运行区里坐标数组的起点。Z1等于0时操作的就是第一颗螺丝的坐标D207、D208、D209Z1等于3时操作第二颗螺丝的坐标D210、D211、D212。程序只需要循环增加D450的值就能逐颗读出所有螺丝坐标不需要为每一颗螺丝单独写一段定位逻辑。这里也用上了“结构一致性”——坐标段在单配方内的偏移是10到33到运行区后就是D20010D210不对前面的表格里我写了坐标段偏移10对应D207让我重新理一下当前运行区D200-D23940个字 D200配方号 D201螺丝数量 D202扭矩上限 D203转速 D204快进深度 D205慢进深度 D206等待时间 D207-D2308颗螺丝坐标每颗3字共24字 D231-D239预留所以坐标起点是D207。上面的代码用D207Z1Z10时取D207这个起点是对的。之前第3章的表格里我写“10到33”但实际操作里坐标起点是D207对应偏移7需要统一一下。让我修正单配方内部布局把坐标段往前挪D5000单配方40字 0 配方编号 1 螺丝数量 2 扭矩上限 3 拧紧转速 4 Z快进深度 5 Z慢进深度 6 拧紧等待时间 7 到 30 是8颗螺丝坐标每颗3字共24字 31 到 39 预留这样D200运行区里7对应D207和前面的代码一致。第3章表格和代码全篇统一。5.3 换型时保证安全双缓冲和互锁逻辑设备运行中切配方最危险的情况是第一颗螺丝刚打完Z轴正在移动突然D200区坐标被换成另一个产品的坐标轴就会走错位置轻则报警重则撞夹具。所以我在应用配方流程里加了三个互锁条件第一设备处于运行状态时M120应用请求直接无效。这个判断用的是M0运行标志位运行中置位。换型只能在设备停止状态下进行。 第二写入配方库也要求设备不运行。因为编辑区D300的数据如果正被某条运动指令读取写入就会产生冲突。 第三HMI上的“保存”“读取”“应用”三个按钮在PLC逻辑层互相锁住。一个流程没走完其他流程不允许启动。这个用M101忙标志统一管理任何流程进行中M101为ON其他请求全部被ANI M101拦掉。这三条互锁在实际项目里帮了大忙。很多现场事故不是程序算错是操作员在设备运行时误点了按钮。PLC逻辑层的互锁挡在HMI按钮之前操作员按了没反应会去看是不是设备还在运行。哪怕HMI上忘记做灰色效果PLC层面也兜得住。6. 断电保持、越界保护与MES远程换配方6.1 配方区必须设置的断电保持参数配方数据是设备的长期记忆一断电就丢的话客户第二天开机还得重新输参数这绝对不行。但很多工程师想当然地以为D区的数据天然断电保持实际上不是。三菱FX3U的D区保持范围是在PLC参数里配置的不是所有D区都带电池保持。我习惯在PLC参数里把D5000到D7399这一整段配方存储区设为锁存让停电后配方仍然存在PLC里。这样客户现场断电重启只需要选一下配方号按应用就能恢复生产。不过也要提醒一点锁存靠PLC电池电池没电照样丢。所以我会在设备交付的时候用HMI的配方导出功能把配方表存一份到电脑或U盘同时教客户怎么备份恢复。示教完坐标、调好扭矩后第一时间导一份后面怎么折腾都不慌。我也建议在程序里加一个配方初始化标志首次上电检测到配方区全零且标志位没建立自动从备份区恢复默认配方防止电池掉电导致设备懵掉。6.2 越界与数据校验把异常拦截在写入之前配方号越界是变址方案最容易出的问题。D100一旦超出配方范围偏移量也跟着超范围D5000Z0就会跑到配方库以外可能读到D7400的备用区甚至更远。那边可能存着其他数据搬进来以后动作程序拿到一堆乱七八糟的坐标后果不堪设想。所以配方号范围校验M50是整个配方管理的第一道闸门。D100小于0或大于59所有流程全部切断。这道校验在写入、读取、应用三个流程里都要串联不能只在某一个流程里加。第二道校验是配方的“头字校验”——每个配方的第一个字强制存配方编号本身。写入时自动覆盖成D100读取和应用前先CMP比较不一致就报警提示“配方未建立或数据损坏”。这个设计成本极低但能拦住两类问题一是客户在HMI上输错配方号读出来的数据张冠李戴二是PLC电池掉电配方区数据变成乱码头字校验能第一时间发现。6.3 MES/上位机通过Modbus远程换配方配方管理做成这样之后再往上走就顺理成章了。如果客户要上MES系统或者产线要集中管理设备配方只需要在PLC里把配方号D100、应用请求M120、完成反馈M122这些软元件映射到Modbus寄存器或线圈。上位机通过Modbus总线往D100写一个配方号再把M120置位设备就自动切换配方了。这个过程中上位机完全不需要知道配方数据存在哪个具体地址也不需要关心偏移量怎么算。它只需要发出“请把5号配方应用下去”这个指令剩下的偏移计算、数据搬送、校验、互锁全在PLC程序里完成。变址寄存器在这里起到了封装的作用——把复杂的地址逻辑收敛在PLC内部对外暴露的只是一个简单的配方号接口。这套结构后来被我沿用到了其他设备上点胶机的胶量参数、锁付设备的扭力曲线、多头机的工位偏移都是同一个套路固定行宽、配方号乘行宽、变址寄存器做偏移、批量搬送进工作区。最后说一点实际体会配方管理这东西代码写出来不难难的是结构设计。先把D区表格画清楚把三个区的结构对齐再动手写指令后面基本一遍过。调试的时候我也习惯在监视表里同时看D100、Z0、D5000Z0三个值确认它们之间的关系像预期那样联动。这个习惯让我少走了很多弯路建议你也试试。
阅读完成 · 觉得有帮助?
咨询建站