ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

FX5U转盘机程序设计与状态机实现:从工艺拆解到代码复用

FX5U转盘机程序设计与状态机实现:从工艺拆解到代码复用 去年在客户现场调一台8工位转盘机三菱FX5U做主控分度伺服加六个气缸工位程序写到一半客户电气主管过来看了一眼问了一句“你们这个转盘程序是不是每个工位的逻辑都长得一样”我说对然后把一个工位的FB实例复制了六份改了IO映射和参数就全通了。那台设备从通电调试到跑满节拍交付用了不到两周。这个经历让我意识到FX5U转盘机程序写得好不好核心不在“能不能动”而在“拆得好不好”——工艺拆清楚了程序框架搭对了后面全是填模块的活。这篇文章就把我做过的一台典型FX5U转盘机程序完整拆开讲一遍。不光是贴状态机、贴ST代码更多是讲清楚为什么这么设计工位怎么划分、互锁怎么加、报警怎么处理、数据怎么往上送。内容面向正在做或准备做转盘机/圆盘机项目的电气工程师也适合刚接触FX5U结构化编程、想理解“设备程序到底怎么组织”的入门者。文中代码是抽离后的核心逻辑段按这个框架搭工程基本能覆盖市面上大多数转盘机需求。1. 拆程序之前先拆工艺转盘机的需求到底长什么样很多同学拿到转盘机项目第一反应是打开GX Works3开始建工程。我建议先忍住把工艺搞明白再动手。转盘机看着简单就是一个圆盘分度转位、工位干活但需求如果没梳理清楚程序写一半发现工位冲突、节拍不够、信号对不上返工成本极高。1.1 工位布局和节拍是程序的“宪法”通常转盘机会按工艺路线拆成若干个工位。拿我做的这台8工位机型举例工位功能主要执行元件1上料人工/振动盘上料气缸、料到位传感器2视觉检测有无、方向视觉相机、光源3压装加工压装伺服/气缸、压力传感器4压装高度检测位移传感器、探针气缸5激光打标激光机、挡料气缸6下料合格品下料机械手/气缸、输送线7下料不良品剔除剔除气缸、滑道8空位/预留—这里有几个设计决策值得说。第一用8工位而不是6工位是因为偶数工位做等分定位方便分度角度就是360/845度而且预留1-2个空位给后续扩站。第二视觉检测放在第2工位而不是第1工位目的是让上料动作完成后转盘转一个工位再检测避免上料抖动影响拍照。第三不良品剔除放在下料之前独立工位而不是在下料口统一挡停原因是避免不良品和合格品在同一个滑道里混淆。定完工位紧接着算节拍。转盘机最大的优势是“所有工位并行动作”——转盘转动时各工位气缸已在准备转到位后同时干活。所以整机节拍不是各工位动作时间之和而是“分度转动时间”和“最慢工位动作时间”两者的最大值。拿这台设备说分度转45度约0.8秒最慢的压装工位约2.5秒整机节拍就是2.5秒左右前提是转盘的转动控制不能等工位全部干完再启动而要在工位动作快结束时就开始“预启动”判断。1.2 从动作时序推导PLC程序的任务清单工位和节拍定完后把整台设备的动作时序画出来然后推导PLC要干的活。这一步我会列一个任务清单后面程序框架全按这个清单来分度控制伺服正转到位、定位完成判断、机械到位双确认工位动作每个工位按“转盘到位后触发—动作执行—完成返回”的顺序走工件状态管理每个工位当前有没有料、料从哪个工位流过来的互锁逻辑气缸未退回不能转盘、安全门未关不能启动、报警时禁止动作不良品处理标记不良工位、到剔除位执行剔除报警与复位伺服报警、气缸不到位、节拍超时数据统计与通讯产量、良率、节拍上报给看板敲黑板**“工件状态管理”是转盘机程序里最容易被新手忽略的模块。**转盘一转动物理工件换位置了但PLC里必须有一个“虚拟工件跟着转”的机制否则到了剔除工位你不知道哪个工件该剔。这个后面在第3章状态机里详细讲。2. 硬件与程序框架怎么搭选型点要落在“省事”和“抗造”上工艺拆完才轮到硬件选型和程序架构设计。FX5U在这个项目里属于“正好够用、还留余量”的选择下面把选型逻辑和工程框架一起说。2.1 FX5U在转盘机场景的核心优势三菱FX5U这几年在中小型设备里上位很快替代了老款FX3U的生态位。针对转盘机我重点看四个点本体集成以太网口程序下载、触摸屏通讯、MODBUS TCP给看板系统全走一个网口省掉额外的通讯模块。晶体管输出型自带4轴200kHz高速脉冲输出小转盘机如果只有分度伺服和一两个工位伺服本体脉冲轴就够了不需要加定位模块或运动控制模块硬件成本低一截。支持ST语言和FB封装这是转盘机程序模块化的关键。8个工位逻辑结构一样我写一个“工位处理FB”例化8个实例就行程序量缩小三分之二后期改工位时序也只改FB内部逻辑。程序容量和数据寄存器量够大FX5U-32MT/ESS程序容量128K步级别数据寄存器也多配方、报警历史、产量统计全塞进去毫无压力。2.2 硬件配置清单和IO规划这台设备的硬件配置大致如下硬件型号/规格用途CPUFX5U-32MT/ESS主控内置以太网、4轴脉冲扩展IOFX5-32EX/32EYT补充离散IO点伺服MR-JE系列配HK-KT系列电机转盘分度驱动阀岛SMC/费斯托带D-Sub或IO-Link控制各工位气缸触摸屏/看板GOT或第三方工业平板操作监控与数据展示传感器接近开关、光电、压力/位移传感器到位检测、工件检测、加工质量检测IO规划上有个经验输入点预留15%-20%输出点预留10%。转盘机调试过程中经常加传感器、改互锁没余量就得外挂继电器箱难看又难维护。我习惯把转盘原位、伺服报警、安全门、急停这些“保命信号”放在CPU本体自带的输入点上扩展模块管工位传感器这样即使扩展模块异常基本的安全互锁仍然在CPU本体上运行。程序框架方面工程结构划分为主程序MAIN、初始化块、转盘控制FB、工位逻辑FB多个实例、报警管理FB、数据统计与通讯块。主程序只做扫描调度和状态汇聚真正的逻辑都在FB里。这样有一个直接好处调试时定位问题非常快转盘不动查转盘FB3号工位气缸不动查第3个工位FB实例不用在梯形图里翻几百行找触点。3. 分度转盘状态机与控制逻辑从“能转起来”到“转得稳”转盘机程序的心脏是分度控制。这里把核心的状态机、双确认到位判断、虚位工件映射三块东西讲透这三块做好了转盘机就稳了。3.1 转盘状态机启动、转动、到位、复位四态闭环我用结构化文本ST写了一个标准的转盘状态机简化的核心逻辑如下CASE stIndexer OF // 待机态等待启动条件满足 STS_IDLE: IF bStartReq AND bSafetyGateClosed AND NOT bFault THEN stIndexer : STS_PRECHECK; END_IF; // 预检态确认所有工位处于可转动状态 STS_PRECHECK: IF bAllCylindersHome AND NOT bServoRunning THEN bServoStart : TRUE; stIndexer : STS_INDEXING; ELSIF bPrecheckTimeout THEN bFault : TRUE; stFaultCode : FC_INDEX_PRE_CHECK_TIMEOUT; END_IF; // 转动态等待伺服定位完成机械到位双确认 STS_INDEXING: IF bServoDone AND bIndexHomeSensor THEN stIndexer : STS_INDEXED; ELSIF bServoDone AND NOT bIndexHomeSensor THEN bFault : TRUE; stFaultCode : FC_INDEX_MISS_HOME_SENSOR; END_IF; // 到位态触发各工位动作 STS_INDEXED: bEnableWorkPulse : TRUE; // 置位一个扫描周期的“开工脉冲” stIndexer : STS_WORKING; // 工作态各工位动作执行全部完成后回到待机态准备下一次分度 STS_WORKING: IF bAllWorkDone THEN stIndexer : STS_IDLE; END_IF; END_CASE;这段代码有几个设计细节非常关键。第一转盘定位完成后不是直接转下一次而是进入WORKING态等待所有工位完成杜绝了“一边干活一边转盘又走”的危险局面。第二启动条件里把“安全门关”和“无故障”放在最前面这是第一层互锁物理上不可绕过。第三预检态引入超时判断防止气缸卡住没回到原位时硬转。3.2 到位判定为什么要“伺服定位完成机械到位传感器”双确认转盘机的分度到位判断我是坚持双重确认的。伺服驱动器会给一个定位完成信号表示“电机到达目标位置并锁定”但从机械角度说电机到位不代表转盘机构一定到位——联轴器间隙、皮带打滑、齿轮背隙都可能让实际位置偏差。所以程序里加一个机械到位传感器一般是接近开关检测转盘底部的定位销或定位槽只有“伺服定位完成”和“机械到位有信号”同时为真才算真正到位。反过来还有一种情况转盘转到一半伺服报警停住此时机械到位传感器信号还亮着因为刚好停在检测点附近程序要判断的是“转盘是否执行了这一次分度”所以我会用一个“转动请求”标志结合到位信号一起判断避免停在原点附近时误判为已经到位。3.3 虚拟工件映射让PLC知道“每一格里有什么”这就是前面提到的工件状态管理。物理上转盘转了45度PLC里不能只转一个角度还要把“哪个工件在哪个工位”这个数据同步转一格。我做法是定义一个8位的工件状态数组// 工件状态数组0无料1合格在制2不良在制 arrPartStatus : ARRAY[0..7] OF INT; // 每次分度到位后所有工件跟着转一格索引递减模拟顺时针转动 FOR idx : 0 TO 6 DO arrPartStatus[idx] : arrPartStatus[idx 1]; END_FOR; arrPartStatus[7] : 0; // 最后一格清空等待新料进入 // 上料工位填入新工件 IF bPartLoaded THEN arrPartStatus[0] : 1; END_IF;这个数组配合工位编号就是整个不良品处理的基石。3号压装工位检测不合格就把arrPartStatus[2]经过一次分度后索引变化置为2每当分度发生数组全体迁移。到了第7工位不良剔除位程序判断arrPartStatus[6]是否等于2是则触发剔除气缸。没有这个虚拟映射你根本不知道一个标记为“不良”的工件到没到剔除口。4. 伺服定位与报警机制JE报警代码逐个对号入座转盘机的分度电机我常用三菱MR-JE系列伺服。这个系列的报警体系按大类和小类拆分排查起来比老款MR-J2直观但前提是你知道每个代码背后的物理原因。4.1 伺服参数设置与分度加减速整定MR-JE配合FX5U脉冲控制时电子齿轮比和加减速参数的设定直接决定转盘分度的“手感”。一般我这样设电子齿轮比根据电机每转脉冲数和转盘减速比调整让PLC的一个脉冲对应一个最小的分度脉冲当量比如0.01度。速度按节拍需要但要留有余量我一般设电机额定转速的80%-90%太高了定位冲击大。加减速时间转盘机负载是典型的惯性负载加减速时间太短会过载报警太长影响节拍。经验值加速0.3秒、减速0.3秒起步惯量大再往上加。停止时伺服锁定定位完成后务必让伺服处于锁定状态防止外力转动转盘导致位置丢失。调试时有一个“看波形”的技巧把MR-JE的监控软件打开看速度指令与实际速度的跟随曲线。加减速结束时曲线有明显的过冲或振荡说明加减速时间不够曲线平稳但节拍偏慢再逐步压缩加减速时间。4.2 MR-JE常见报警代码与现场排查转盘机现场最常见的伺服报警集中在下面这一批报警代码含义常见现场原因排查方向AL10.1编码器通讯异常编码器线接触不良、受干扰、弯曲半径过小检查编码器插头、换屏蔽线、走线远离动力线AL16编码器电池电压低绝对值编码器电池耗尽更换电池更换后需要执行绝对值复位AL25绝对位置丢失电池失效、编码器数据异常复位绝对值位置重新建立机械原点AL50/51过载/过流机械卡死、加减速太猛、负载惯量大盘车检查机械、增加加减速时间、算惯量比AL52过载连续长时间超负载运行降低节拍/负载检查减速机这里面被问得最多的就是AL10.1。有一次现场调试转盘转着转着突然停操作面板报AL10.1复位后跑一段时间又报。刚开始怀疑编码器坏了换了线还是一样。最后发现是编码器电缆和伺服动力电缆扎在同一个线槽里伺服电机加减速时动力线的电磁干扰窜进编码器差分信号。处理方式简单粗暴——编码器线单走屏蔽槽屏蔽层单端接地此后半年没再报过。所以现场看到AL10.1第一步不是换编码器而是检查线缆敷设和屏蔽。4.3 程序里如何做报警登记与复位互锁程序端的报警管理不能只是给触摸屏发个位。我在报警FB里做三层硬件报警直接映射伺服报警、急停、安全门、工艺报警气缸超时、检测不合格、通讯报警看板掉线、视觉超时。每个报警记录五要素报警代码、发生时间、所在工位、持续时长、累计次数。复位逻辑有个容易踩坑的地方报警复位按钮不能无脑清所有报警。比如AL25绝对位置丢失后没有重新建立原点之前不允许清除报警继续运行否则转盘会在错误的位置上开始工作造成撞机。程序里我会根据报警类型分等级可自动复位AL16电池低只提示不强停、节拍超时偶发的需手动确认复位AL10.1编码器通讯可能影响位置的、气缸到位超时需原点重建后才能复位AL25绝对位置丢失、位置偏差过大这样设计后现场操作工不容易“报警随手一按就继续跑”设备安全性会明显上一个台阶。5. 数据往上走MODBUS TCP、可视化看板和通讯掉线处理现在的转盘机项目单纯能跑已经交不了货客户基本都会提“要能看到产量、不良率和设备状态”的需求。这块FX5U做起来很顺手因为本体网口直接支持MODBUS TCP。5.1 FX5U的MODBUS TCP主站与从站配置FX5U的MODBUS TCP分两个角色。做从站时触摸屏、第三方看板、MES系统通过网口直接读取PLC的寄存器区不用写任何通讯指令在GX Works3里把“MODBUS TCP从站功能”启用、映射好数据区就行。做主站时PLC主动去读其他智能设备比如带网口的压力传感器、扫码枪、视觉控制器需要调用MODBUS通讯指令按功能码读写保持寄存器或输入寄存器。转盘机项目我通常把CPU同时配置为对触摸屏/看板做从站被读对一台称重变送器做主站主动读重量值。两边互不冲突一个网口里用端口号区分。5.2 看板数据区规划产量、节拍、不良率都放哪看板系统要读的数据我会在PLC里固定映射到一段连续的D寄存器区域并做成一份文档交给上位机开发寄存器地址内容数据类型说明D200总产量32位整数合格品不良品D204合格品数32位整数下料工位计数D208不良品数32位整数剔除工位计数D212当前节拍ms32位整数最近一次分度周期D216运行状态16位整数0待机/1运行/2报警/3急停D220当前报警代码16位整数最近一条报警M300报警标志位位区对应各报警等级数据刷新逻辑上有个细节产量这类累积数据不能只在PLC里加还要考虑断电保持。FX5U的锁存寄存器区域可以设置为断电保持但默认锁存范围和D区可能重叠要在参数里明确指定哪些D寄存器是锁存区。否则现场断电一次产量清零客户会对数据准确性产生信任危机。5.3 通讯掉线看板断了不能把PLC拖死现场调试经常遇到的另一个问题是第三方看板程序写得不好狂发请求把PLC通讯资源占满导致触摸屏都卡顿。我的处理习惯是网口通讯端口数合理限制触摸屏用固定端口看板系统单独端口。在PLC里做一个“通讯心跳监测”看板每5秒写一个递增计数到D300PLC检测到D300不变化就置位“看板离线”标志但只提示、不影响设备运行。所有对上位机的数据读取PLC永远是被动响应不允许上位机写PLC的核心控制位比如启动、急停。控制位只在本地HMI和物理按钮上。这样处理后即使看板系统崩溃设备侧依然能正常生产最多就是操作屏上弹一个“数据看板离线”的提示。6. 实弹调试踩坑时序竞争、原点回归和干扰误动作程序写完了真正的考试在现场。转盘机的调试问题高度集中在时序、原点和干扰三个方向讲几个真实案例。6.1 时序竞争伺服定位完成信号和到位传感器“打架”第一次调试这台转盘机时遇到一个诡异现象转盘有时到位后程序要等一个扫描周期才进入工作态有时要等十几个扫描周期偶尔还直接报警“到位信号丢失”。在线监控发现伺服定位完成信号ON之后机械到位传感器不是立刻ON而是有大约30-60ms的延迟因为分度销是机械结构有响应时间。程序里我的判断是“伺服完成AND机械到位”但伺服完成信号到达CPU的时刻如果刚好在机械传感器ON之前就会出现“伺服已ON、机械未ON”的窗口被误判为异常。这类时序竞争的处理不是去掉双确认而是在“伺服到位后”加一个时间窗等待伺服到位信号ON启动一个80ms的定时器在定时器窗口内等待机械到位传感器窗口内到位算正常窗口结束还没到位才报“到位信号丢失”。这个“先到先等”的思路要用在所有存在“两个信号有先后到达”的场合。6.2 原点回归增量编码器转盘断电后再开机的问题如果分度伺服配的是增量编码器断电后PLC不知道转盘在哪个工位上电必须回原点。转盘机回原点的标准做法是上电后以一个较慢的速度朝固定方向点动直到碰到机械原点传感器后停止再把当前坐标清零或设为原点位置值。这个逻辑本身不难难在回原点前必须保证气缸全在安全位置否则回原点过程中转盘转动可能撞到伸出来的气缸。所以原点回归条件必须包含“所有工位气缸退回原位”和“安全门关闭”。另一种更省事的方案是直接用绝对值编码器MR-JE-B系列配电池断电后位置不丢上电不用回原点直接判断当前位置到目标工位的角度差最短路径旋转。但绝对值编码器代价高、电池需要定期换小设备预算有限时我一般推荐增量回原点程序多做一步而已。6.3 传感器干扰导致“幻影工件”现场还遇到过一件有意思的事2号视觉工位的工件检测传感器在转盘启动瞬间偶尔会“闪”一个信号导致PLC误认为那个工位有料结果压装工位对着空位压了一刀模具差点撞坏。查到最后是传感器供电电压在伺服启动瞬间被拉低传感器内部逻辑抖动输出了一个毛刺。解决手段有几个层面硬件上在传感器电源加隔离DC-DC或大容量滤波电容软件上对输入信号加滤波FX5U自带输入滤波时间可调把这类检测信号从默认的几毫秒调到20ms左右毛刺就能被滤掉。但要注意滤波时间加大后信号响应也变慢凡是参与“安全互锁”的信号如急停、安全门不能加大滤波必须保持最快响应所以滤波该加给“普通检测信号”而不是所有信号。7. 源码怎么复用把转盘机逻辑抄到别的设备上最后说源码复用。很多工程师手里有几个“祖传程序”新项目来了就把旧程序拷过来改结果改得面目全非自己都捋不清逻辑。转盘机程序因为是标准模块化结构复用价值极高但复用的方法有讲究。7.1 哪些FB可以直接拿走我这次拆解的工程里下面几块是纯逻辑、几乎零修改就能复用的转盘分度状态机FB参数的工位数、分度角度、窗口时间改成新项目的值内部逻辑不动。报警管理FB跟硬件完全解耦只处理“报警代码时间戳计数复位等级”任何设备都能用。虚拟工件映射逻辑所有“转位类型设备”转盘、平移台车、连续式升降机都用同一套数组迁移思路。上位机数据区映射只要客户要数据看板这份寄存器规划表可以直接抄。7.2 移植时必改的三件事复用不是“复制粘贴完事”有三个方面必须重新核对第一IO映射。新设备的传感器和执行器点位必然不同改IO映射时要顺手检查输入源型/漏型是否一致防止烧输入点。第二工位动作时序。每个工位的工艺动作千差万别工位FB内部的顺序功能图要按新工艺重写这是工作量最大的部分但好在结构不变改起来有章法。第三伺服参数和安全逻辑。加减速时间、扭力限制、急停回退距离都要按新设备的机械数据和客户安全要求重新设定这一步偷懒迟早出事。交付时我习惯在源码工程里附三份文档IO分配表、FB接口说明、变量命名汇总表。文档不花多少时间但客户维护时依赖这些资料下次改版升级也靠它们。写转盘机程序这几年我最大的体会是设备的复杂度和程序的组织方式呈指数关系三五个工位时随手写梯形图也能跑工位一多、互锁一复杂结构化设计就不是“更好了”而是“必须”。FX5U的ST和FB能力为这种设计提供了很好的支持但工具始终是工具真正让设备稳定跑起来的是写程序之前把工艺拆到位、写程序时把逻辑分清楚、调程序时把细节抠扎实。希望这篇拆解能让你少走几条弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进