ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

西门子S7-1200三轴机械手控制系统结构化编程实现

西门子S7-1200三轴机械手控制系统结构化编程实现 先说结论用西门子S7-1200做一套三轴直角坐标机械手的控制系统完全可行。而且这套东西的编程思路一旦整理成模板后面再接手同类型的上下料、搬运、码垛项目基本就是改参数的事不用从头再撸一遍程序。我手头这套程序已经在两台设备上跑过从最开始单轴点动调试到三轴联动跑完整个搬运节拍中间踩了不少坑也把结构化编程的套路彻底磨顺了。这篇文章就把它拆开讲透。这个项目解决的是最典型的三轴机械手搬运场景X轴加Y轴做平面移动Z轴做升降末端挂一个气动夹爪把工件从传送带取料到托盘上。控制核心是S7-1200配合三套伺服驱动器、触摸屏和传感器构成一套完整的工艺闭环。适合谁看正在做1200运动控制项目的电气工程师、准备把机械手控制做成标准化模板的团队以及第一次接触PLCopen运动控制指令的工控新手。下面进入正题。1. 为什么用1200做三轴机械手方案选型与系统架构1.1 需求明确与核心难点我把需求先列清楚三根轴分别是X轴横移、Y轴纵移、Z轴升降形成直角坐标结构。末端气动夹爪用来夹取工件工件到位检测靠光电传感器Z轴带原点开关和上下限位X/Y轴也各有原点和限位。客户要求的动作是传送带检测到工件到位机械手从取料位抓取放到托盘指定位置完成一个循环后继续抓下一个托盘放满后报警提示换盘。这里面真正的技术难点其实只有一个就是三轴联动。所谓联动不是简单的三根轴各动各的而是要求它们在同一段时间内协调运动保证末端执行器走出一条符合工艺要求的空间轨迹。比如Z轴先上升到安全高度X/Y轴同时运动到目标点上方这段过程里如果X和Y速度不匹配机械手走的就不是直线而是折线姿态来回扭不仅难看还会加大机械磨损。后面第三节我会专门讲怎么处理。另外还有个管理层面的隐性需求客户工厂里不止一台设备后续可能还有不同规格的机械手所以程序必须做成可复用的模板不能每个项目从零开始写。这就自然引出了结构化编程的要求。1.2 硬件选型与两种驱动器方案对比S7-1200到底能不能驱动三轴机械手能但它有个绕不过去的坎1200没有S7-1500那种轴组Kinematics功能不能直接调用MC_MoveLinear这类空间插补指令。这意味着1200上的联动只能靠工艺逻辑和速度匹配去实现而不是硬件级的插补。这个现实问题我在做方案时反复确认过最后确认它不影响本项目因为直角坐标机械手做搬运90%的运动路径都可以拆成先垂直、再直线、再垂直的组合根本不需要真正的空间直线插补。驱动器方案我对比过两种一种是PN通信控制V90伺服另一种是PTO脉冲口控制步进驱动器。对比项V90伺服PN通信步进电机PTO脉冲CPU要求固件V4.0以上带PN口1214C/1215C均可控制精度高闭环带抱闸中开环高速易丢步通信占用走PROFINET可做诊断占用高速脉冲输出点成本高低调试难度需会配置驱动器报文和工艺对象简单直接高速性能好一般最终选型是V90方案主要原因是Z轴垂直方向必须用带抱闸的伺服电机断电时自动锁轴这是安全要求步进电机只能做到电气锁定做不到机械锁定断电会往下溜。项目预算允许的情况下V90是正解。如果做小负载、低速度的轻载设备步进方案也不是不行就是要在程序里多写丢步检测和超时报警。1.3 系统拓扑与硬件清单最终硬件配置如下西门子S7-1200 CPU 1215C DC/DC/DC固件V4.5以上三套V90伺服驱动器加60mm伺服电机Z轴配抱闸KTP900 Basic触摸屏工业交换机若干口的就够光电传感器、原点接近开关、上下限位开关气动夹爪、电磁阀、磁性开关网络拓扑很简洁CPU的PN口接交换机交换机下面挂三个V90和触摸屏。我用交换机而不是CPU直连V90是因为后续可能加视觉系统上位机先留好扩展口。通信报文这里注意一下V90在EPOS模式下用TIA组态时我选的是报文111位置控制PZD工艺对象挂上去之后MC_Power、MC_MoveAbsolute这些指令才认轴。不同固件版本支持的报文列表可能有差异组态时以设备视图里实际能选到的为准。如果报文选错症状就是使能发下去驱动器没反应或者直接报通信类故障这个坑很多人都会遇到。2. 结构化编程整体设计从变量到FB的分层拆解2.1 数据建模用UDT把轴变成一张表结构化编程的第一步不是写代码而是设计数据结构。我把每个轴的所有参数和状态封装成一个UDT用户自定义数据类型名字叫UDT_AxisData。打个比方这个UDT就像一张体检表轴的身高、体重、病史、体检结果全在里面拿到这张表就能完整描述一根轴。UDT里我分成了四组指令接口Enable使能、Home回原、MoveAbs绝对定位、MoveRel相对定位、Stop停止、JogPlus正点动、JogMinus负点动工艺参数目标位置、运行速度、加减速度、回原方向、位置上下限机械参数丝杆导程、编码器每转脉冲数、电子齿轮比用于单位换算状态反馈当前位置、当前速度、到位标志、回原完成标志、错误代码、总线状态有了这个UDT轴的数据定义就统一了。程序中用三个背景实例分别代表X、Y、Z轴数据块结构完全一样只是参数值不同。这也是模板化的第一层数据结构统一程序逻辑才能统一。2.2 程序骨架OB1怎么搭程序组织上我用的是经典的分层结构OB100 初始化 → 读取断电保持参数、复位状态 OB1 主循环 → 调用FB_RobotSequence主流程状态机 FB_RobotSequence → 调用FB_MotionManager三轴协同调度 FB_MotionManager → 调用FB_AxisControl × 3X/Y/Z各一个实例 FC_Convert → 单位换算工具函数 FC_SpeedCalc → 联动速度匹配计算函数这样的好处是层次清晰最外层状态机只管设备现在该干什么中间层只管怎么把目标点分给三根轴最内层只管单根轴怎么执行定位指令。改动作不用动底层换电机不用动上层各改各的。语言选择上我基本全用SCL安全回路和急停逻辑用LAD。SCL写状态机、数组、公式计算特别顺手LAD画互锁和急停回路直观。有人觉得1200必须用梯形图其实固件V4.0以上SCL已经是完整支持的不用怕。2.3 FB封装细节FB_AxisControl参数接口设计FB_AxisControl是我整个程序里复用率最高的功能块它的作用就是把西门子PLCopen运动控制指令MC_Power、MC_Home、MC_MoveAbsolute、MC_MoveRelative、MC_Stop统一封装成一个标准接口外部只需要给指令和参数不用关心内部怎么调工艺对象。FB内部的结构大概是首先调用MC_Power使能轴使能逻辑里我处理了报错复位和急停联动。回原模式我选的是MC_Home的Mode3也就是找参考点开关加编码器零脉冲每次回原位置的一致性很好。定位方面绝对运动和相对运动都用标准指令实现到位判断不是完全依赖指令的Done位而是额外用实际位置和目标位置的偏差窗口判断偏差小于0.2mm且保持200ms才算到位这样可以过滤掉伺服微调过程中的抖动。调用这个FB的时候我对三根轴分别实例化FB_AxisControl 实例名 X_Axis背景数据块DB_Axis_X、Y_Axis背景数据块DB_Axis_Y、Z_Axis背景数据块DB_Axis_Z。三份代码完全一致只是工艺对象和参数不同。以后要加一根轴只需要再拖一个实例改一下参数接口就行代码一行不用变这就是结构化编程复用性的直观体现。3. 三轴联动控制实现速度匹配与路径规划3.1 先泼冷水1200没有轴组插补联动怎么理解我得先把话说清楚免得有人拿着这个方案往点胶机、激光切割机上套然后跑不起来骂我。S7-1200不支持MC_MoveLinear、MC_MoveDirect这类轴组插补指令这是硬件和固件层面的限制别指望用1200做真正的三轴联动空间直线插补。真正的插补要上S7-1500配轴组工艺对象或者外挂独立运动控制器。那1200的联动怎么做答案是软联动。即不追求每个插补周期都精确同步而是通过运动任务拆分和速度匹配让多根轴在同一时段内并行运动并保证在选定的同步点比如从取料位的点走到放料位的点同时到达。搬运场景下机械手走的是直角路径上升、平移、下降、取放件软联动完全够用。这个认知非常重要。我见过有工程师答应客户1200做联动控制最后写程序才发现插补指令在1200上根本不存在项目直接卡壳。做方案前先确认硬件的运动控制边界比什么都重要。3.2 速度匹配算法基准轴与比例速度软联通的关键就是速度匹配。假设机械手要从点A(x1, y1)平移到点B(x2, y2)且要求X轴和Y轴同时启动、同时到位这样才能走出一条45度方向的平滑斜线在XY平面上。数学上很简单两轴运行时间相等而距离可能不等所以速度比必须等于距离比。设X轴行程dx |x2 - x1|Y轴行程dy |y2 - y1|。为了节拍最快行程大的轴基准轴按允许最大速度运行行程小的轴按比例降速。具体计算计算基准轴行程dMax max(dx, dy)取基准轴速度Vmax为允许运行速度计算运行时间T dMax / Vmax另一轴速度 V 对应行程 / T换算成程序就是把FC_SpeedCalc写成一个函数输入两轴的目标位置和当前位置输出两轴各自的运行速度。放到程序里是这样// FC_SpeedCalc 核心逻辑SCL伪码 dx : ABS(DB_Axis_X.PosTarget - DB_Axis_X.PosActual); dy : ABS(DB_Axis_Y.PosTarget - DB_Axis_Y.PosActual); IF dx dy THEN vBase : V_MAX_X; T : dx / vBase; vY : dy / T; vX : vBase; ELSE vBase : V_MAX_Y; T : dy / vBase; vX : dx / T; vY : vBase; END_IF;这里注意一个细节基准轴的速度不能超过该轴的最大速度非基准轴计算出来的速度也不能超限。如果非基准轴算出的速度超了说明两轴距离比超出了速度比范围这时就要反过来校验先设定非基准轴的最大速度再反推基准轴速度保证两边都合法。节拍优化上也有一点心得如果X轴距离是Y轴的几倍速度比差距很大那么斜线会比较扁这是物理限制程序改不了。想优化只能改机构布局让两个方向行程接近一些。这个案例里X方向行程600mmY方向200mm所以联动时X基本跑满速Y按比例降到大约三分之一整体运动时间是流畅的。3.3 位置换算与电子齿轮比伺服系统里有两个单位体系一种是PLC里的工程单位毫米、毫米每秒一种是伺服内部的脉冲单位。如果不做换算程序里看到的数值和实际位置就对不上调试时非常容易乱。V90增量编码器默认2500线4倍频后每转10000个脉冲。配的丝杆导程是5mm也就是说电机转一圈负载移动5mm。所以每毫米对应的脉冲数每毫米脉冲数 10000 ÷ 5 2000 脉冲/mm位置分辨率就是 1 ÷ 2000 0.0005mm这个精度对搬运应用绰绰有余。在TIA的工艺对象机械参数里我设置电机每转的负载位移 5mm、每转脉冲数 10000工艺对象会自动完成换算PLC程序里直接使用毫米单位不用手工转换。这个换算关系一定要在项目文档里写清楚不然换个人维护程序看到工艺对象里面的10000和5不知道是什么参数很容易改错。我习惯在UDT的机械参数里把丝杆导程、编码器分辨率、电子齿轮比全部显式存一份注释写明计算过程哪怕工艺对象里改了程序里也能查得回原始机械数据。3.4 一个完整搬运动作的路径拆解三轴机械手做一个完整的取料-放料循环路径是这样拆解的第一步Z轴从当前位置上升到安全高度比如100mm位置这个动作只有Z轴动其他轴保持。 第二步X/Y轴联动从取料位上方移动到放料位上方。这里用FC_SpeedCalc计算两轴速度配合FB_AxisControl同时触发两个轴的绝对定位。 第三步Z轴下降到放料高度执行放料动作气动夹爪打开。 第四步Z轴再次上升然后X/Y轴联动返回到取料位上方。整个循环里真正用到联动算法的就是第二步和第四步。为什么要先把Z升到安全高度再联动因为在机械手平移过程中如果Z轴还插在料堆里容易撞到工件或托盘。这个安全高度是工艺参数可以在HMI上调整换产品时不用改程序。运动中还有个细微处第二步联动开始时Z轴已经到达安全高度但到位信号和X/Y启动信号之间有几十毫秒延迟程序里要做等待否则可能出现Z还没到位X就开始跑的情况。我采用的做法是状态机在Z轴到位后再置位下一个运动使能到位判断用位置窗口偏差而不是Done位窗口偏差设为0.3mm确保稳定。4. 工艺流程状态机与手自动安全逻辑4.1 状态机与状态枚举三轴机械手如果不写状态机代码会变成一大堆M继电器散落在各处改一个动作牵一发动全身。我全部用SCL的CASE语句写状态机状态枚举定义在一个全局DB里S_INIT : 0, // 上电初始化 S_HOME : 1, // 回原点 S_READY : 2, // 准备就绪 S_PICK_APPROACH : 3, // 到取料位上方 S_PICK_DOWN : 4, // 下降取料 S_GRIP_ON : 5, // 夹爪闭合 S_PICK_UP : 6, // 上升 S_PLACE_APPROACH: 7, // 到放料位上方 S_PLACE_DOWN : 8, // 下降放料 S_GRIP_OFF : 9, // 夹爪打开 S_PLACE_UP : 10, // 上升 S_COMPLETE : 11 // 单循环完成状态机的好处是所有状态转换都在一个CASE里逻辑一目了然。每个状态都有明确的进入动作和退出条件比如S_PICK_DOWN状态里进入时触发Z轴下降到取料位置退出条件是Z轴到位且夹爪松开状态确认。如果条件超时没满足就跳到故障处理状态。我还加了一个状态转换超时监视每个状态都有独立的计时器。比如S_PICK_DOWN设置了3秒超时如果3秒内没有到取料位置说明Z轴可能被卡住或者机械故障程序直接进入报警停止状态防止继续动作造成损坏。这个超时时间可以根据节拍调整但远比没有超时安全。4.2 自动运行流程与节拍估算自动运行的主流程是这样的设备启动后先检查是否回原没回原不允许进入自动确认回原后等待工件到位信号工件到位状态机从S_READY开始往下走执行完放料如果是托盘最后一个位置置位托盘满报警并在HMI弹窗换盘后按复位键清除报警继续下一轮。节拍上做个粗略估算。假设Z轴行程50mm、速度250mm/s单次上升或下降需要0.2秒考虑加减速实际约0.4秒X/Y联动行程600mm和200mm联动时间约3秒夹爪闭合和打开各0.5秒。单循环总时间大约7秒左右一小时能处理约500个工件对这个物料尺寸来说效率是够的。如果客户要求更快的节拍一般优先从三个方面优化提高最大运行速度、缩短夹爪动作时间、优化路径减少无效行程。4.3 手自动切换、急停与回原设计手自动切换这个细节要处理好否则设备在生产中一切手动状态机就会错乱。我的方案是手动模式禁止状态机运行所有轴动作由HMI点动按钮直接触发切回自动之前必须先将机械手移动到安全位置或者重新执行回原然后才允许启动自动循环。回原的必要性在于手动操作后PLC记录的坐标可能与机械实际位置不一致贸然跑自动轻则撞料重则撞机。回原时序也要规范X和Y轴先回原Z轴最后回原。原因是Z轴如果先回去并且停在不安全高度X/Y运动时可能撞到Z轴上挂的夹爪或工件。回原完成后每个轴的回原完成标志都置位任何一根轴报错掉使能所有轴的完成标志都要清掉要求重新全部回原这是最保守也最安全的方式。急停逻辑分两层外接急停按钮直接接入伺服驱动器的STO端子物理上切断驱动器的使能输出这是硬件级保护同时急停信号也接到PLC输入点程序里把状态机强制跳转到急停状态封锁所有轴运动指令、关闭夹爪输出并记录当前是哪个状态被中断。复位时不能直接回到自动必须先手动确认安全、清除故障、再执行回原才能恢复。安全无小事这里我宁可流程繁琐一点也不给事故留机会。5. 调试实录与常见问题排查5.1 分阶段调试顺序三轴机械手联调如果直接上自动循环出问题根本不知道是哪个环节。我的做法是严格按阶段来第一个阶段单轴点动验证。在HMI手动画面里逐轴点动确认每个轴的电机方向、限位方向、原点开关逻辑都正确。这一步最关键曾经遇到过Z轴因为电机相序接反点动上升实际是下降幸好限位和急停都生效没造成损失。方向验证通过以后才允许配置回原。第二个阶段单轴回原验证。分别对X、Y、Z回原反复执行十次以上确认每次停在原点位置一致偏差小于0.1mm才算通过。如果回原位置有漂移先检查原点开关信号有没有抖动给输入点加滤波时间再检查回原模式是否使用了Z相脉冲。第三个阶段程序状态机空跑。不上工件、不动作夹爪让程序把状态机跑一遍看状态转换顺序和时间点是否符合预期。这时候可以用HMI上的状态显示页面来观察每个状态都有指示灯出问题一眼能看出来卡在哪个状态。第四个阶段带上夹爪和工件做完整循环。先从低速倍率50%开始跑确认路径安全以后再逐步提升到100%。最后连续跑两小时以上验证稳定性同时记录实际节拍与设计节拍的差距。5.2 用Trace观察速度曲线调参数TIA Portal自带的Trace功能在这个项目里立了大功。调联动参数时我用Trace同时记录X轴和Y轴的实际速度曲线、位置曲线然后检查联动段两条速度曲线是否按比例同步变化。如果发现某根轴速度波动大一般是加减速时间设置不合理或者是机械上存在爬行现象。调加减速的经验值加速度设在1000到1500mm/s²之间比较稳妥太小影响节拍太大会引起机械抖动和过冲。我一开始把加速度设在2500mm/s²结果X轴到目标点以后位置过冲明显Trace上看到一个约1mm的过冲回退说明机械刚性扛不住这么大的加速度。后来逐步降到1500mm/s²过冲基本消失节拍损失只有零点几秒完全能接受。Trace还能验证我的速度匹配算法是否正确。如果X和Y到达目标点的时间差超过50ms就需要检查是哪个轴的到位判断逻辑延迟了或者是某个轴的负载偏重导致实际速度跟不上给定值。V90伺服有自动增益和优化功能我用它在带负载状态下做了自动优化机械响应改善很明显。5.3 常见问题速查表调试过程中遇到的问题记录下来整理成一张速查表后面维护时能节省大量排查时间。现象可能原因排查方法Z轴断电后下滑未用抱闸电机或抱闸未接检查抱闸供电确认V90抱闸控制配置回原位置每次不一致原点开关信号抖动或未使用Z相输入滤波回原模式改Mode3联动时走线不是直线两轴速度未按比例计算检查FC_SpeedCalc的调用时机和参数到目标点后有回退加速度过大引起过冲Trace观察曲线降低加速度MC_Power使能后轴不动作V90报文与工艺对象不匹配核对TIA设备组态中的报文号轴偶尔报通信故障PROFINET网络不稳定检查网线接头交换机端口屏蔽接地料盘满却还继续放件托盘计数器逻辑未复位检查换盘后的计数复位信号这些只是高频问题实际项目中还会有各种奇葩现象。我的经验是遇到问题先别急着改程序先用Trace或者程序状态监控把现象复现出来看清楚是不是自己预期的逻辑在执行很多时候问题出在传感器信号或者机械卡滞不在程序本身。5.4 模板复用经验与扩展方向这套程序模板现在已经沉淀成形我第二次做类似项目时就体会到了模板的价值换了一台龙门式三轴机械手轴行程和负载都变了但程序部分只改了UDT里的机械参数和HMI上的工艺参数状态机、联动算法、手自动逻辑一行没动从组态到跑通节拍只花了三天。这就是结构化编程对项目交付速度的提升。模板还能怎么扩展如果后续要把S7-1200升级到S7-1500程序可以平滑迁移因为UDT和状态机的设计跟硬件平台无关迁移时只需要把工艺对象重新组态一遍然后把1500才支持的轴组插补功能挂到相关状态里原来写的软联动逻辑正好作为降级备份。如果加视觉系统做定位引导也只需在状态机前面加一个视觉拍照-坐标标定环节视觉反馈的像素坐标通过标定矩阵换算成机械手坐标然后写入UDT里的目标位置其他的联动逻辑不用动。实际上我第二台设备就是加了视觉的这套结构撑住了。最后再分享一个小技巧调试阶段在HMI上做一个坐标写入页面可以直接输入任意轴的设定位置并执行绝对定位方便测试不同工位的坐标值比每次修改程序里的目标位置再下载要高效得多。有了这个页面调试人员不需要懂程序也能帮忙测点位项目进度快很多。
RELATED READING

延伸阅读

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