
前阵子做了一个3轴码垛设备项目控制器用的是西门子S7-1500编程环境是TIA博途TIA Portal。项目里最核心的技术点就是两套伺服电机做长行程轴的双驱同步配合一个升降轴和一个旋转轴完成自动码垛。整个程序主体用SCL编写运动控制全部走PNPROFINET通信下的工艺对象Technology Object没有采用传统发脉冲的方案。设备基本情况是这样码垛范围大约1.2米乘1.5米最大层高1.8米被码的纸箱单件最重50公斤左右节拍要求5到8秒一个循环。X轴行程有6米多机械上跨距大如果只用一个电机驱动动态刚性和两端同步精度都不够所以设计成轨道两侧各装一台伺服通过减速机和齿轮齿条同时驱动同一个滑座。这就引出了双驱同步的问题两台电机怎么保证时刻同步、不打架。我最终用TIA博途里的同步轴功能在PLC内部把一个轴设为主动轴另一个设为跟随轴从动轴实时读取主动轴的位置量并按1:1比例耦合相当于做了一套电子双驱。这篇内容适合正在做码垛、搬运、双驱同步这类设备的电气工程师和PLC程序员参考尤其是准备从脉冲控制转向PN工艺对象、又对SCL编程不够熟的人。我会把方案选型、同步轴组态、码垛逻辑、调试踩坑都拆开讲清楚。1. 项目需求与方案选型1.1 设备工艺与运动轴划分码垛设备本身的机械结构不算复杂一条长行程X轴负责把抓取机构从取料位送到码垛位Z轴负责升降R轴负责旋转。这里的X轴不是单电机而是由两台伺服电机分别驱动两端的齿轮齿条合成一个滑座这是整个项目最需要花心思的地方。Z轴是垂直升降用的是滚珠丝杠加配重带重载抱闸R轴挂在Z轴下端用于纸箱90度或180度旋转配合隔层交叉码垛。工艺循环拆开就是取料位抓取箱体提升到安全高度X轴移动到目标垛位下降到放料高度释放箱体再提升返回取料位一个循环结束。听起来不复杂但设备一天要跑几千个循环位置精度不能慢慢漂节拍也不能因为程序结构不合理而掉链子。所以我一开始就把控制方案定成了运动控制全部走工艺对象逻辑计算全部走SCL层次分明后面好维护。1.2 双驱为什么要做电子同步先说清楚机械背景。两个电机通过齿轮齿条驱动同一个滑座本质上两边是在共同抬一个刚体。如果两个电机输出的位置不一致一个快一个慢机械上就会互相憋劲轻则导向件磨损异常重则齿轮打齿、滑座卡死。所以双驱同步的核心不是让两个轴“都动起来”而是让它们在任意时刻处于完全一致的位置和速度包括加速段、减速段、换向时刻。做双驱有几种常见路子。最早的做法是驱动器和驱动器之间做速度主从从动驱动器接收主动驱动器的速度给定相当于一个速度环跟随。这种方案精度不高因为从动侧跟随的是速度而不是位置时间长了会累积位置偏差机械上会慢慢憋出应力。好一点的会在机械上做硬连接再靠驱动器做力矩分配但调试难度高两个电机出力稍有差异就容易出现一台频繁过载。再高级一点就是把两个轴拉进PLC的运动控制系统里做位置级同步。在TIA博途里就是工艺对象耦合一个轴定义为主轴另一个轴定义为同步轴从动轴实时跟随主轴的实际位置而不是只看速度。这个方案要求总线实时性够好所以要用PROFINET通信并且尽量把总线周期压短。我最终选的就是这条路径原因很简单位置级同步能够让两个电机在所有运行阶段保持位置一致程序侧只看见一个“主轴”从动轴透明跟随设备跑起来才稳。1.3 为什么用SCL和PN工艺对象先聊SCL。码垛项目里有大量计算工作比如根据产品长宽高、每层排布数量、堆放层数算出每个箱子的目标坐标。这类数据计算逻辑用LAD写要写很久而且容易绕晕SCL可以像写高级语言一样用循环、数组、CASE语句代码量少、可读性强。状态机逻辑用SCL的CASE实现特别清晰后续现场改工艺、调整垛型基本不需要改动程序主体只需要改配方参数。这一点在工程项目里太重要了因为现场永远会改工艺。再说PN工艺对象。S7-1500和伺服驱动器之间走PN通信比传统发脉冲最大的优势是信息量大、抗干扰好、接线少。PLC通过标准报文读到的不光是目标位置还有驱动器实际位置、实际速度、实际转矩、报警信息。工艺对象相当于PLC内部已经封装好了一套运动控制内核你只需要在组态里填好机械参数、动态参数然后调用标准运动控制指令就能完成绝对定位、速度运行、齿轮同步这些操作不需要自己写位置环和速度环。对于双驱同步这种要求位置级联的项目PN工艺对象几乎是必选。2. 系统架构与同步轴核心概念2.1 整体控制架构系统分三层管理层是HMI通过以太网连接PLC用于配方选择、手动自动切换、报警查看控制层是S7-1500 PLC程序里包含运动控制指令、码垛逻辑、IO逻辑PLC与伺服之间走PROFINET通信执行层是四台V90 PN伺服对应X主动轴、X从动轴、Z升降轴、R旋转轴另外还有真空吸盘、气动夹爪和各种传感器。这里有一个容易被忽略的细节PROFINET设备名必须和设备实际设定完全一致而且网络规划时要给每个设备分配独立的IP。V90的PN接口支持实时通信但若要做双驱同步我建议在组态里把总线周期尽量缩短必要时启用等时同步模式让主动轴和从动轴的位置值在同一个时间切片内刷新。现场如果为了省钱把伺服挂到普通交换机上或者级联太多很容易出现周期抖动直接影响同步效果。2.2 工艺对象里的“同步轴”是怎么玩的在TIA博途的运动控制工艺对象里轴类型有位置轴、速度轴、同步轴等。同步轴并不是一种独立的物理轴而是指这个轴可以作为某个主轴的跟随者。定义一个同步轴时它仍然对应一台具体的伺服驱动器和编码器只是运行时接收的运动指令来自耦合关系而不是来自直接定位指令。我这里的配置是主动X轴定义成位置轴从动X轴定义成同步轴。在同步轴组态里有一个动态跟随窗口用来限制跟随误差。运行程序时用MC_GearIn指令把从动轴和主动轴耦合起来比例设为1比1从动轴就实时复刻主动轴的位置和速度。这样对上层逻辑来说双驱双电机在程序里被抽象成一个“主轴”我只需要对主动X轴发定位指令从动轴会自己跟上省心很多。2.3 为什么用主从齿轮同步而不是龙门对象很多做运动控制的朋友会问双驱同步和龙门同步是不是一回事答案是否定的。龙门同步对象强调的是两个完全独立轴的机械联动比如高速桁架双驱结构龙门对象内部会做更复杂的力学解耦和误差分配适合两个轴各自带独立负载的场景。而我这台设备两个电机驱动的是同一个滑座、同一套齿轮齿条本质上是一个轴的机械系统被拆成两套驱动单元这种情况下用主从齿轮同步更直接也更容易调试。我个人的经验是不要一看到“双驱”就去选龙门对象。龙门对象的内部动力学模型如果和机械实际不匹配反而可能让两边力矩控制打架。主从齿轮同步反而简单可靠从动轴死跟主动轴位置机械上天然不会发生方向性冲突。当然如果设备是那种两根横梁完全独立、靠同步关系保持平行度的龙门结构那时候再认真考虑Gantry对象。2.4 同步启动的时序很重要同步不是程序一运行就GearIn这么简单。我这里的启动时序是两个轴先各自回零到同一机械零点确认编码器方向一致然后在主动轴静止的状态下使能从动轴并建立耦合关系最后才让主动轴按工艺运动。如果主动轴还在运动时就贸然执行GearIn从动轴为了追赶目标位置会产生一个速度阶跃机械冲击很大严重时直接把齿打了。同样重要的是从动轴一旦进入同步状态就不能单独操纵。我在HMI设计上把双驱从动轴单独隐藏起来只能通过维护面板操作防止现场人员误触把耦合给断掉引起故障。3. SCL程序与码垛逻辑实现3.1 程序整体结构码垛项目的程序结构我一般拆成几个功能块主循环负责扫描调用运动控制背景负责所有MC_指令实例和状态码垛核心是一个FB状态机处理取料放料的动作顺序垛型计算是一个FC根据配方参数生成目标位置数组另外还有IO和安全逻辑FB处理急停、门锁、限位、真空检测这些信号最后是HMI接口变量也就是配方数据、状态字、手动操作标志。这样的分层有个明显好处运动控制、逻辑控制、数据管理互不干扰。现场如果反馈“放料位置偏了”我先查垛型计算FC再查坐标缓存不会一上来就翻几万行的梯形图。3.2 码垛数据模型与坐标计算码垛参数一般有产品尺寸长L、宽W、高H、每层行数Row、列数Col、堆放层数Layer、托盘起始点坐标、箱体之间的间隙。已知这些参数可以算出第n层第i行第j列的坐标X坐标等于起始点X加上列序号乘以箱体长度加横向间隙Y坐标等于起始点Y加上行序号乘以箱体宽度加纵向间隙Z坐标等于底层高度加上层序号乘以箱体高度。这里要特别注意奇数层旋转90度的处理奇数层箱子旋转之后X方向间距用箱宽Y方向间距用箱长相当于坐标计算里X和Y的系数对调。交叉码垛的目的是让上下层箱体纹路交错形成“砌墙式”结构垛型才稳定不会散。比较实用的做法是用二维数组存每一层的坐标。我在SCL里用一个三层循环把全部坐标预先计算到DB里程序运行时状态机只做查表操作。这样做的好处是现场改字号、改托盘尺寸时只需要改配方数据程序自动重新计算全部坐标不用改逻辑。3.3 关键SCL代码框架参考下面是一个简化版的码垛坐标计算FB实际项目里会再包一层配方管理和数据校验FUNCTION_BLOCK FB_StackCalc VAR_INPUT Product : Struct_Product; // 产品长宽高 StartPos : Struct_XYZ; // 托盘起点坐标 Rows : INT; // 行数 Cols : INT; // 列数 Layers : INT; // 层数 Execute : BOOL; // 触发计算 END_VAR VAR_OUTPUT Done : BOOL; Stack : ARRAY[1..10, 1..10, 1..10] OF Struct_XYZ; // 预生成的坐标缓存 END_VAR VAR i, j, n : INT; TempX, TempY, TempZ : LREAL; END_VAR IF Execute THEN FOR n : 1 TO Layers DO FOR i : 0 TO Rows - 1 DO FOR j : 0 TO Cols - 1 DO IF (n MOD 2) 1 THEN // 奇数层旋转90度X方向间距用宽度 TempX : StartPos.X INT_TO_LREAL(i) * (Product.Width GapY); TempY : StartPos.Y INT_TO_LREAL(j) * (Product.Length GapX); ELSE TempX : StartPos.X INT_TO_LREAL(j) * (Product.Length GapX); TempY : StartPos.Y INT_TO_LREAL(i) * (Product.Width GapY); END_IF; TempZ : StartPos.Z INT_TO_LREAL(n - 1) * Product.Height; Stack[n][i 1][j 1].X : TempX; Stack[n][i 1][j 1].Y : TempY; Stack[n][i 1][j 1].Z : TempZ; END_FOR; END_FOR; END_FOR; Done : TRUE; ELSE Done : FALSE; END_IF;这段代码的核心就在于用两层内部循环生成行和列位置用外层循环生成层数位置奇数层时候把长宽系数对调。实际项目里还会加边界检查防止数组越界以及判断托盘实际尺寸是否够放避免生成出互相干涉的坐标。状态机这边用CASE语句写工艺动作结构大概是空闲等待启动去取料位下降到取料位置真空吸合或夹爪夹紧提升到安全高度X轴移动到码垛坐标下降到放料位置释放提升返回。每一步的转移条件是定位完成信号加上位置窗口校验两个都满足才允许进入下一步避免只信指令Done信号而在总线异常时继续往下走。3.4 为什么状态机用SCL CASE而不是LAD指令TIA博途里也有GRAPH或者步序器可以画流程图做顺序控制。但我的习惯是码垛程序用SCL状态机因为CASE语句可以把每一步的进入条件、转移条件和该步要执行的动作集中写在几十行代码里现场搜查问题非常直观。如果是GRAPH画起来复杂后面改垛型、加步骤还要重新编译下载整个逻辑图比较费劲。而且SCL状态机配合数组和循环特别自然。比如“这一层还剩几个箱子没放”用循环变量和层计数器一算就出来了如果换成LAD计数器、比较器、沿信号都要单独组代码量成倍增长还容易出错。4. 同步轴组态与调试要点4.1 PN组态与工艺对象的配置步骤在TIA博途里配置这套系统大致步骤是固定的在硬件目录里添加S7-1500 CPU和V90 PN伺服驱动器分别设置设备名和IP地址确保设备名和驱动器侧实际设定一致。在PN/IE网络中建立连接总线周期建议从默认值往下调整根据驱动器能力尽量做到毫秒级这样才能保证同步数据刷新足够快。给V90配置标准报文位置控制一般选包含控制字、状态字、速度给定实际值、位置实际值的报文。报文选对很重要因为后续工艺对象能从报文里映射到哪些数据取决于这一步。在PLC运动控制目录下新建工艺对象主动X轴选PositionAxis从动X轴选SynchronousAxisZ轴和R轴选PositionAxis。为每个轴分配驱动器和编码器对应刚才配置的报文。组态机械参数每转位移、方向取反、软限位、抱闸选项等。这一步必须和机械工程师核对螺距搞错了全盘都错。组态动态参数最大速度、最大加速度、加加速度、跟随误差上限。动态参数先给保守值后面调曲线再往上升。有一个常见坑是工艺对象组态里驱动和编码器如果没有正确分配编译可能不报错但下载后指令一直报无效轴状态。我每次做完组态都会先下载一个空程序用调试面板点动验证一下轴是不是“活”的再做后续编程。4.2 同步指令的实际调用建立双驱同步关系的核心指令是MC_GearIn在SCL里调用时大致是这样的MC_GearIn_XSlave( Enable : SyncEnable, Master : Axis_X_Master, Slave : Axis_X_Slave, RatioNumerator : 1, RatioDenominator : 1, MasterSyncPosition : 0.0, SlaveSyncPosition : 0.0 );Enable信号用上升沿之后保持为TRUE的中间变量这样耦合建立后一直保持。急停后同步中断程序会自动断开该变量并置故障标志等复位后重新执行同步。MC_GearIn执行前从动轴的MC_Power必须先置为运行状态否则指令会报错。同步建立之后程序里实际上只需要对主动X轴发定位指令从动轴会由内部同步关系自动跟随。我在状态机里只看见一个X轴所有的定位目标都发给主动轴从动轴对上层逻辑透明。这也是为什么说PN工艺对象能让双驱项目从程序层面“减轴”——物理上有四台伺服逻辑上始终是三个轴在工作。4.3 双驱调试最常用的工具和方法TIA博途在线后运动控制调试面板可以对每个工艺对象进行点动、回零、定位测试。双驱调试最关键的界面是跟踪记录同时显示主动轴位置、从动轴位置、位置差、速度曲线。我一般这样调先用很低的速度分别点动主动、从动轴检查方向是不是一致、编码器计数的正负是否统一。双轴同步低速走一段行程观察位置差曲线正常应该始终在0附近允许有一点高频噪声但不能有趋势性漂移。逐渐把速度提高到额定值观察跟随误差峰值如果超限就要调整组态里的动态参数或者回到机械侧检查预紧力。跑全行程自动循环200次记录最大位置偏差和两边电机平均转矩如果一侧转矩明显偏大要让机械重新调整预紧。双驱最怕的是“看起来同步但两边转矩不均”。这种问题在位置曲线上往往不明显要在Trace里同时看两个轴的实际转矩偏差太大就说明机械上存在干涉光靠电气是调不过来的。4.4 机械预紧和反向间隙的配合很多双驱项目最后调不好瓶颈根本不是程序而是机械间隙。齿轮齿条如果没有做预紧滑座导轨滚轮间隙过大反向间隙会直接反映到编码器读数上程序会误以为是同步误差。建议在组态里给主动轴和从动轴设置相同的反向间隙补偿值但更重要的是和机械师傅沟通先把间隙调到一个比较低的水平电气补偿才能生效。实际经验是双驱跑起来两轴位置差如果总是出现规律性的“台阶”——前进一个值、后退又另一个值——这大概率是齿条间隙问题不是伺服参数问题。这时候改增益、调滤波都没用要把机械侧重新预紧一遍。5. 常见问题与排查技巧5.1 双驱轴报“跟随误差超限”同步轴最常见的故障就是跟随误差超限。碰到这个报警我先看Trace曲线区分是持续偏差还是瞬时尖峰。持续偏差通常是从动侧机械负载过大、传动比设置错误、或者预紧力不对称瞬时尖峰则要查总线周期是否抖动、编码器信号是否受到干扰。处理办法是适当放宽动态跟随窗口但不要放宽到比机械允许的两轴间隙还大否则同步保护就失去意义。我在现场遇到过一次诡异情况从动轴每次运行到行程中段才报跟随超限查下来发现那段齿条因为磨损有点“爬齿”负载突然变大。换了齿条就好了。所以调试同步轴如果只在空载低速下跑很多问题发现不了要带载、跑全行程才算数。5.2 V90报通信故障或掉站V90本身报警挺丰富常见的通信问题基本集中在设备名不匹配、PN电缆接触不良、交换机级联过多导致IRT失效。排查思路是先在博途网络视图里看设备是否在线再看设备名和IP有没有冲突最后查物理链路。V90的PN口最好直接连PLC或者经过一层高质量交换机不要多级级联否则实时性没法保证。关于掉站还有个经验有时候报警出现得没有规律是因为现场的网线屏蔽层没有接地伺服高频噪音从PN线串进来。把网线换成带屏蔽的工业成品线并且保证屏蔽层两端可靠接地报警会明显减少。5.3 码垛位置越来越偏码垛错位未必是运动控制精度不够很多时候是机械基准丢了。原点开关如果每次回零的位置一致但因为回零方向或速度不同停车位置会有微小差异托盘或者物料放置位置本身有偏差也会被程序“如实”放大气动夹爪放料瞬间箱体惯性滑动同样会造成随机偏移。排查时做一个标记实验在固定位置放一个参考标记连续运行几十个循环看偏移是固定的还是随机的。固定偏移可以用零点补偿来消除随机偏移就要回到机械侧查松动或者夹紧力。还有一种情况是每层错位逐渐加大这种八成是层间坐标计算问题或者托盘已经歪了。5.4 断电重启后程序启动不起来伺服轴断电后如果用的是增量式编码器位置丢失上电必须重新回零。这里有个坑即便是绝对编码器如果组态没有正确配置或者掉电期间机械被手动移动过工艺对象里的位置值和实际位置会对不上。所以每次上电我建议强制做一次回零校验或者至少让设备先回到原点附近再进入自动流程。Z轴还要特别注意溜车。伺服抱闸控制一般由PLC根据使能状态输出时序上要“先建立使能再延迟释放抱闸”否则电机还没出力抱闸先松了Z轴会直接溜下去危险又伤机械。断电急停后重新上电第一个动作就是回原点并且回零速度要压低。5.5 常见问题速查表现象可能原因处理方法双驱跟随误差超限机械负载不均、齿条磨损、预紧不当检查机械侧调整预紧适当放宽跟随窗口V90通信掉站设备名不匹配、交换机级联、屏蔽接地不良核对设备名直连PLC更换屏蔽网线码垛位置逐渐偏移原点回零不一致、托盘位移零点补偿重新校准机械基准断电后无法启动增量编码器位置丢失、抱闸时序错强制上电回零调整抱闸释放时序伺服高速抖动增益过高、刚性不足、总线周期抖动降低速度环增益缩短总线周期双驱一侧过载两边预紧不对称、同步相位偏差重新机械预紧检查同步组态6. 实操心得与扩展建议最后分享几点我在这类项目里的体会。第一双驱同步项目里程序反而是最简单的真正决定成败的是机械预紧和总线实时性。调试时先把两个轴的位置差曲线调平直再谈码垛精度和节拍。程序上再怎么优化也弥补不了机械侧齿条间隙和导轨精度的问题。第二同步轴采用SynchronousAxis之后从动轴不要单独进入手动模式去移动否则耦合状态一旦断开恢复时序麻烦。我在HMI上把双驱从动轴隐藏掉只允许维护人员通过调试面板操作避免误触。第三如果项目后续要扩展混码、异形产品建议一开始就把配方UDT化把产品长宽高、排布数量、层数、间距做成数据块数组。SCL程序里预留一个计算接口换新产品类型时不需要动轴只需要改配方数据块这是码垛设备最值得投入的地方。最后再分享一个小技巧双驱同步轴的轴名和工艺对象命名一定要规范比如主动轴就叫X_Master从动轴就叫X_Slave在程序里大量引用MC指令时命名是否清晰直接影响排错效率。当时我在一个紧急故障处理中就是因为轴名太随意多花了一个多小时才理清楚耦合关系从那以后再也不敢图省事随便起名了。