2026/10/19 3:59:05

基于S7-1200的双轴焊接轨迹插补与摆动控制实现

基于S7-1200的双轴焊接轨迹插补与摆动控制实现 接到这个活儿的时候我心里其实没底。一台西门子S7-1200要同时管住两根轴的焊接轨迹既要走圆弧还得叠加上摆动最后焊缝宽度还要求控制在±0.3mm以内。放在几年前这种需求大多数人会直接推荐上专业运动控制器但现实情况是预算有限、交期也紧现场还只有这台现成的S7-1200和一套老改造设备。硬着头皮做下来反而把双轴焊接的轨迹插补、加减速规划、工艺联动这一整套算法摸透了。这篇文章就按我的实际设计过程来写把硬件架构、算法思路、代码实现和调试踩坑都捋一遍给正在做同类自动化焊接设备的朋友一个参考。1. 项目缘起为什么标准PLC要干运动控制器的活1.1 工艺需求一条稳定的圆弧焊缝有多难这个项目要解决的工况是管板双层堆焊焊枪沿着圆周端面走一圈同时在焊接过程中做小幅横向摆动让熔池均匀铺展。手动焊接的质量完全靠师傅的手感稍微疲劳焊缝宽窄就飘鱼鳞纹也时密时疏。甲方提的需求很直接焊枪自动跑轨迹焊缝宽度稳定起弧收弧点可调圆度不能有明显偏差。这类工况看着简单真正动手才会发现问题。焊接速度通常在0.2到1.2m/min之间换算下来每秒只有3到20mm。焊枪行程又很慢但是精度要求高摆幅、摆频、两侧停留时间都要单独可调。如果还用老办法——X轴走一步、Y轴走一步的纯点位控制——焊缝中间必然出现明显的停顿痕迹也就是行业内说的梯田纹。所以必须做真正的轨迹插补让合成速度恒定两个轴同步运动。1.2 选型逻辑为什么是S7-1200而不是专用运动控制器同僚听说我用S7-1200做双轴联动第一反应都是PLC能行吗。行不行要看需求边界。专用运动控制器确实强圆弧插补、电子凸轮、多轴协调都是内置功能但代价是学习成本高、接线调试复杂还要重新学一套软件。这个项目只有两轴速度极低精度在0.1mm量级S7-1200完全够用。还有一个很现实的原因设备上原本就挂着S7-1200做逻辑控制HMI也是现成的。用同一台PLC直接扩展运动控制功能不用增加额外的硬件通信节点操作工也不需要面对第二套面板。我当时算了一笔账改造周期至少能压缩三分之一。事实证明只要算法写得清楚S7-1200做低速双轴插补完全是可行的。提示选型卡壳的时候先算速度、精度、轴数三个硬指标。低速低精度场景下标准PLC加算法往往是最务实的方案不必被专业控制器吓住。2. 硬件与控制架构三条可行的双轴驱动路径2.1 路径对比PTO、PROFINET周期通讯、模拟量速度给定S7-1200接伺服/步进驱动器我试过三条路分别对应不同精度和预算需求。第一条是高速脉冲输出PTO方案。S7-1200部分CPU本体集成多路高速脉冲输出最高频率100kHz级别外接步进驱动器或脉冲型伺服即可。优点是接线最简单PLC只管发脉冲和方向驱动器负责功率放大。缺点是轴多了以后脉冲频率和插补协调需要自己写加减速处理不好容易丢步。第二条是PROFINET周期通讯方案。PLC作为PROFINET IO控制器通过周期通讯把位置给定发给伺服驱动器伺服内部做位置闭环。优点是多轴同步性好、抗干扰强适合高速高精度场景缺点是调试参数多而且要保证PLC任务周期稳定否则通讯抖动会直接反映到轨迹上。第三条是用模拟量速度给定。PLC通过AO模块输出0到10V给伺服的速度模式位置由PLC外接编码器高速计数闭环。这种方案精度最低速度响应也慢我基本不推荐除非是老设备改造、驱动器没有脉冲口也不能换。2.2 我最终采用的配置组合这个项目最终选了PTO加步进驱动器的方案主要有两个考虑焊接速度低脉冲频率需求极低根本用不满PTO带宽现场没有现成的PROFINET伺服新增伺服通信模块的成本也比步进方案高不少。而且焊接工位本身干扰源多脉冲线短距离传输比模拟量线抗干扰能力好。硬件配置大致是这样的行走轴用一台步进电机带齿轮齿条行程覆盖整个圆周脉冲当量设定为0.005mm摆动轴用另一台步进电机带小丝杠行程正负15mm脉冲当量0.001mm。两台驱动器都工作在细分模式结合PLC的PTO输出。S7-1200内部组态两个运动控制轴对象位置单位为mm速度单位为mm/min这样HMI上显示的就是实际毫米值不需要维护者再去换算脉冲数。提示PTO方案的关键是驱动器细分要和脉冲当量匹配。步进电机本身有定位精度极限细分太高同样速度下脉冲频率成倍提高不一定更准但一定更容易丢步。2.3 位置反馈的校验思路这里要说一个容易忽略的点PTO方案下PLC发出的脉冲数不等于电机实际走的距离。步进开环控制一旦丢步轨迹就会静悄悄偏掉。我在行走轴上加了一个高速计数器通过接近开关或编码器反馈做位置校验。每到一个硬件原点把PLC内部的实际位置和计数器读数对比偏差超过设定阈值就报警而不是继续闷头跑。摆动轴我反而没加反馈因为行程只有十几毫米就算有丢步也不会对焊缝成型产生致命影响而且摆动轴空间狭小加编码器很麻烦。做工程一定要懂得取舍把昂贵资源放到真正影响质量的位置上而不是每个轴都堆传感器。3. 轨迹算法核心圆弧、直线与摆动叠加工件3.1 插补周期的选择与单位换算轨迹平滑的关键在于时间分割法。我在PLC里设置了一个固定循环中断周期取10ms每个周期计算一次两个轴的位置增量然后把增量换算成位置指令发给运动控制工艺对象。10ms对焊接速度来说已经足够细腻按20mm/s的焊接速度一个周期移动0.2mm步进分辨率为0.005mm约40个脉冲焊出来的轨迹肉眼看已经非常光滑。单位换算这步容易栽坑。HMI上输入的速度单位是mm/s运动控制工艺对象的速度单位是mm/min位置单位是mm但脉冲输出时又要换算成脉冲数。我在程序里建了一个统一的换算函数所有轴共用一套系数避免在多个地方反复换算导致混乱。// 单位换算示例速度mm/s - mm/min #vel_mm_per_min : #vel_mm_per_sec * 60.0; // 位置增量mm - PLC运动控制位置指令mm #dx_pos : #dx_mm; #dy_pos : #dy_mm;3.2 直线插补按速度矢量分配增量直线轨迹最简单也最常用。已知目标直线的方向和焊接速度每个插补周期内走过的弧长就是速度乘时间然后把这段弧长分解到X、Y两个方向。FUNCTION_BLOCK FB_LineInterp VAR_INPUT iEnable : BOOL; iVel : REAL; // 当前合成速度 mm/s iCycTime : REAL; // 插补周期 0.01s iAngle : REAL; // 直线方向角 rad iTotalLen : REAL; // 直线总长 mm END_VAR VAR_IN_OUT ioAccumLen : REAL; // 已走长度 ioLastDx : REAL; ioLastDy : REAL; END_VAR VAR_OUTPUT oDx : REAL; oDy : REAL; oFinished : BOOL; END_VAR VAR_TEMP ds : REAL; END_VAR BEGIN #oFinished : FALSE; IF #iEnable THEN #ds : #iVel * #iCycTime; IF #ioAccumLen #ds #iTotalLen THEN #ds : #iTotalLen - #ioAccumLen; #oFinished : TRUE; END_IF; // 用当前角度计算增量 #oDx : #ds * COS(#iAngle); #oDy : #ds * SIN(#iAngle); #ioAccumLen : #ioAccumLen #ds; ELSE #oDx : 0.0; #oDy : 0.0; END_IF; END_FUNCTION_BLOCK为什么不用传统的逐点比较法逐点比较法适合生成单个脉冲的场合每一步频率不均匀高速时易产生振动。时间分割法每个周期输出的是平滑的速度矢量和后面的加减速配合更自然焊出来的鱼鳞纹也更均匀。低速焊接场景里时间分割法更稳定。3.3 圆弧插补角度累加而不是坐标累加圆弧插补是这项目的核心难点。圆周堆焊要求焊枪沿圆弧精确走一整圈起点和终点必须闭合。我用的方法是角度增量法每个插补周期根据当前速度算出角度增量Δθ再更新圆心角然后直接用圆心坐标加半径乘以正余弦得到目标位置。增量等于新位置减旧位置既简单又不累积坐标误差。FUNCTION_BLOCK FB_ArcInterp VAR_INPUT iEnable : BOOL; iVel : REAL; // 当前合成速度 mm/s iCycTime : REAL; // 插补周期 0.01s iCenterX : REAL; // 圆心X iCenterY : REAL; // 圆心Y iRadius : REAL; // 圆弧半径 mm iDir : INT; // 1逆时针-1顺时针 END_VAR VAR_IN_OUT ioAngle : REAL; // 当前角度 rad启动前设初始角 ioLastX : REAL; ioLastY : REAL; END_VAR VAR_OUTPUT oDx : REAL; oDy : REAL; oFinished : BOOL; END_VAR VAR_TEMP ds : REAL; dAngle : REAL; targetX : REAL; targetY : REAL; END_VAR BEGIN #oFinished : FALSE; IF #iEnable AND #iRadius 0.0 THEN // 角度增量 弧长 / 半径方向通过iDir控制 #ds : #iVel * #iCycTime; #dAngle : #ds / #iRadius * #iDir; #ioAngle : #ioAngle #dAngle; // 从圆心计算目标点避免坐标累加漂移 #targetX : #iCenterX #iRadius * COS(#ioAngle); #targetY : #iCenterY #iRadius * SIN(#ioAngle); #oDx : #targetX - #ioLastX; #oDy : #targetY - #ioLastY; #ioLastX : #targetX; #ioLastY : #targetY; ELSE #oDx : 0.0; #oDy : 0.0; END_IF; END_FUNCTION_BLOCK圆弧插补的终点判断我放在了上位组织逻辑里启动前算好需要扫过的总角度比如整圈就是2π带缺口圆弧就是终点角减起点角。每次中断把累计角度和总角度比较达到要求就把使能断开调用收弧逻辑。这里不建议用坐标差值判断终点因为坐标差值受到角度微小偏差的影响可能出现提前或延后结束。提示圆心角的初始值很重要。操作工在HMI上输入的通常是起点的坐标或角度程序要做一次从坐标到角度的换算用ATAN2函数安全处理四个象限。3.4 摆动焊接三种波形叠加到法线方向堆焊工艺里焊枪不能直愣愣往前走得让熔池有足够的铺展时间。摆动焊有三种常见波形三角波用于等速两侧锯齿波用于单向往返快速回位还有正弦波用于追求柔和过渡的场合。我在这项目里重点用的是三角波加两侧停留时间因为管板堆焊需要两侧温度充分防止咬边。三角波摆动的算法思路很简单它在摆动轴相当于轨迹法线方向上产生周期性往复偏移量。关键参数是摆幅、摆频、两侧停留时间以及摆动轴与行走轴的相位关系。焊接效果好不好很大程度上取决于这些参数的匹配而不是轨迹本身。// 三角波摆动偏移量计算 #phase : #phase #cycTime * #swingFreq; IF #phase 1.0 THEN #phase : #phase - 1.0; END_IF; IF #phase 0.5 THEN #swingOffset : 4.0 * #swingAmp * #phase; ELSE #swingOffset : 4.0 * #swingAmp * (1.0 - #phase); END_IF; // 减去幅值中心得到正负对称的偏移 #swingOffset : #swingOffset - 2.0 * #swingAmp;这里注意一个行业里容易混淆的点摆幅到底是峰峰值还是半幅值。很多焊机说明书上写的摆幅是总量也就是从最左到最右的距离而算法里用的幅值通常是相对于中心线的单边偏移。如果没确认就直接代入焊缝宽度会差一倍。我在HMI上明确标了单边摆幅和总摆宽两个字段内部算法用单边摆幅界面上同时显示两者防止现场师傅理解偏差。4. 速度规划与双轴同步焊缝不抖的底层逻辑4.1 直接启动为什么不行步进电机直接高速启动大概率丢步就算不丢步焊枪猛一冲起弧点的熔池也会被带飞。焊接设备最忌讳轨迹速度突变因为焊缝宽度、熔深都跟热输入相关而热输入又和行走速度直接相关。速度抖动意味着热量忽多忽少焊缝表面就会出现颜色不均、宽窄不一。所以双轴插补之前必须加入速度规划。我在前面的FB里使用的iVel不是恒定值而是一个由加减速状态机实时生成的动态速度。直线插补和圆弧插补都吃这个速度值这样两个轴在任何时刻的增量比例都保持一致合成的轨迹方向就不会偏。4.2 S曲线加减速的查表实现梯形加减速实现简单但加速度有突变对焊接熔池扰动很明显。我做了一个更平滑的S曲线加减速把速度变化分成加加速、匀加速、减加速、匀速、加减速、匀减速、减减速七个阶段每个阶段速度按时间二次变化。在线计算七段公式在PLC里也可以做但为了稳定我采用了预计算速度表的办法。程序启动时根据目标速度、加速度、加加速度先生成一张100点的速度查找表插补中断每周期查一次表取速度。这样把数学运算从实时中断里挪走中断里只剩查表和插补运行稳定得多。// 速度表生成核心代码 #t_total : #targetVel / #acc #acc / #jerk; #stepTime : #t_total / 50.0; FOR #i : 0 TO 100 DO #t : #stepTime * #i; IF #t #acc / #jerk THEN #velTable[#i] : 0.5 * #jerk * #t * #t; ELSE #velTable[#i] : // 完整七段公式这里省略中间变换 END_IF; END_FOR;实际现场调试时我把加速度和加加速度都做成HMI参数。慢速焊接时加速度取大一点问题不大但摆动频率高的时候加速度太大会导致摆臂机构振动焊缝边缘出现锯齿。经验值是摆动轴的最大加速度不要超过行走轴的1.5倍否则两轴响应不一致合成轨迹会拐出奇怪的弧线。4.3 主从速度比例的双轴同步双轴同步不是简单的同时启动而是每个插补周期内两轴位移的比例必须严格等于轨迹斜率。我的做法是同一个速度规划函数输出当前周期合成速度然后直线插补和圆弧插补共用这个速度。两个轴的运动指令在同一个循环中断里发出本质上就保证了同步。还有一个细节是运动指令的执行时机。S7-1200的运动控制指令MC_MoveRelative是异步执行的如果这个周期还没执行完下个周期又发新指令指令队列可能堆积。我在每个轴前面加了一个到位标志判断上一周期指令执行完成后才发送新的相对位移否则保持原指令。虽然每周期只有10ms但这一步不处理长时间运行后轨迹会逐渐滞后最终导致圆弧不闭合。IF #axisX.InPos AND #axisY.InPos THEN // 同步发送两个轴的增量 END_IF;5. 焊接工艺联动算法要懂熔池不能只懂轨迹5.1 起弧与收弧的时序编排焊接过程不只是让轴走起来那么简单。起弧时要先送气、再引弧、然后延迟启动行走收弧时又要先减速、填弧坑、再断电流。这个时序如果放在操作工脑子里一致性就没法保证。我把它写进了PLC的状态机里和插补算法联动。起弧时序我设计成启动按钮按下后先打开保护气延时0.3到0.5s建立气体保护环境然后给出起弧信号电流从小电流切入同时开始行走加减速焊枪移动速度达到设定值的80%以后摆动轴才开始工作避免起弧阶段熔池不稳。收弧时序反过来先停摆动再减速行走速度降到设定值的30%以下时用收弧电流填满弧坑最后切断电流和气。这些延时的数值不能拍脑袋定要在现场配合工艺试焊。我预留了至少五组HMI参数分别是送气提前、起弧延时、行走延迟、收弧电流延时、停气滞后。调试的时候一组一组试直到鱼鳞纹均匀、弧坑填满为止。5.2 摆幅、摆频与两侧停留时间的工艺匹配摆动参数虽然由工艺师傅定但我们做算法的得知道这些参数影响的物理含义。摆幅增大熔池宽度增大但摆幅过大容易造成坡口一侧过烧、一侧未熔合。摆频太慢中间部分温度过高焊缝会鼓成弧形摆频太快熔池来不及铺开表面出现粗糙波纹。两侧停留时间是很多国产设备忽略的参数其实特别关键。焊枪走到坡口边缘时停留一两百毫秒让边缘温度补足能明显减少咬边。我的算法把停留时间拆成左停留和右停留两个独立参数方便现场根据实际偏向调整。从实现上看就是在三角波接近峰值位置时输出保持不变直到停留时间结束再继续翻转。5.3 焊缝偏移在线补偿双轴焊接难免遇到工件安装偏差或者热变形焊枪沿轨迹走一圈后实际焊缝中心线可能偏离原始轨迹。热变形尤其麻烦后半圈和前半圈的位置偏差可能达到几毫米。我的处理方式是在轨迹程序中加入在线偏移量。HMI上设了两个偏移字段一个沿轨迹切线方向一个沿法线方向。操作工在焊接过程中通过观察窗微调这两个偏移值PLC把偏移叠加到插补输出上。如果后续要更自动化的方案可以外接激光焊缝跟踪传感器把传感器的输出换算成偏移量原理是一样的只是信号源从手动旋钮换成传感器。// 叠加偏移到插补增量 #oDx : #oDx #offsetTangent; #oDy : #oDy #offsetNormal;6. 调试实测七个坑的完整排查记录6.1 圆弧不闭合的排查链路第一次空跑圆周轨迹的时候焊枪走完一圈没有回到原点偏差大概2mm。焊缝可能看不出但直觉告诉我这个偏差会随着圈数累积。排查过程是这样的先在HMI上把轨迹参数和实际位置参数同时显示单步跑一圈确认起点坐标确实被PLC读到了。然后怀疑是圆弧插补的浮点累积误差。因为刚开始的代码用累加坐标的方式生成轨迹每个周期的新坐标基于上一个坐标计算。虽然单次误差很小但一圈有几千个插补周期误差确实可能累积到毫米级。我改成基于圆心角和圆心坐标的算法后偏差缩小到0.3mm左右。还剩0.3mm原因不在插补算法而在机械回差和步进电机丢步。最后通过调整驱动器刚性参数和增加到位标志判断把最终偏差控制在了0.1mm以内完全满足焊接要求。这个排查链路很有代表性先排除算法误差再排除电气参数最后查机械性能顺序错了很容易被误导。6.2 脉冲当量换算错误走了十倍距离空跑时焊枪直接冲过了限定行程驱动器报警幸好有硬限位。查下来是单位换算表写错了一个系数机械传动我算成了每毫米需要1000脉冲结果是10000脉冲。十倍偏差电机直接飞车。从此所有轴参数都做成一个以毫米为单位、单独组态的工艺对象PLC内部不直接面对脉冲数只有驱动器和电子齿轮处理脉冲比例。也就是说程序的轨迹计算全部基于毫米最后才发送给运动控制工艺对象。这样即使机械参数改起来程序也不需要动。6.3 HSC计数受焊接干扰跳数反馈校验装好以后发现焊接起弧瞬间高速计数器读数会跳几十个脉冲。一开始怀疑接线问题重新检查屏蔽和接地后仍有跳数。后来定位到是焊接逆变电源的高频干扰通过公共地线侵入PLC。解决方法是给PLC这边加了隔离变压器反馈线穿磁环高速计数输入用双绞屏蔽线单端接地。干扰信号从几十个脉冲降到了零附近。这里提醒做焊接自动化设备的朋友接地和抗干扰要从项目之初就规划好不能等调试期再补。6.4 步进电机在急停复位时丢步急停再复位后焊枪位置明显偏移但PLC内部位置还是急停前的位置这就是开环步进的通病。单纯提高驱动器电流加剧了电机发热并没有根治。我最终的做法是把急停复位流程改成了主动回原点急停解除后两轴低速返回硬件原点以原点计数器的位置清零PLC内部位置然后重新示教起点。虽然多花两秒钟但每次启动都是绝对基准可靠性大大提高。6.5 摆动轴相位反了导致偏焊第一次试焊焊缝中心明显偏在坡口一侧。起初怀疑是焊枪角度问题调了夹具也没用。后来用低速空跑看摆动轴的实际运动方向发现它和行走轴的相位一正一反也就是说焊枪摆动到了坡口两侧但停留时间和行走方向配合错了。把摆动方向参数反转后焊缝立刻回到中心。这个问题的教训是方向类参数必须做成HMI可调字段不要写死在程序里。不同设备机械装配不同程序通用性就靠这些可调方向来保证。6.6 循环中断抖动对插补的影响S7-1200的循环中断周期受高优先级任务和通信影响并不是严格10ms。插补算法直接吃这个周期周期抖动会让速度波动。焊接速度低的时候不明显摆动频率提高后鱼鳞纹开始出现不均匀的疏密变化。我把插补周期从10ms改成20ms并把通信处理优先级调低抖动明显改善。因为焊接速度慢20ms周期下每步0.4mm依然满足精度。另外所有插补计算全部放到循环中断OB里主程序只做状态切换和HMI数据交互避免主程序扫描时间影响中断响应。6.7 摆动波形参数的单位陷阱前面提过的摆幅峰峰值和半幅值问题在调试中真的坑过我一次。现场师傅说摆幅6mm我算法里填了6结果总摆宽变成12mm焊缝明显超宽。后来我在所有参数接口处都标注了半幅值HMI界面那栏也改成单边摆幅并同时显示换算后的总摆宽彻底杜绝了误解。说实话调试那两周我把大部分时间花在了这些问题上插补算法本身反而没什么大改动。搞自动化焊接项目算法是骨架但真正决定产品好不好用的是这些细枝末节的匹配和标定。7. 最后分享一个非常实用的调试习惯所有插补算法做完以后我习惯在HMI上加一个空跑测试页面用30%速度跑一遍完整轨迹同时实时记录两个轴的实际位置和给定位置。很多问题不需要等真正起弧就能看出来轨迹是否闭合、摆动是否居中、加减速是否顺滑全部在空跑阶段暴露出来。还会再加一个单步模式轨迹每一毫米暂停一下方便现场师傅逐个检查起弧点、收弧点和中间段的焊枪姿态。这个小工具不算复杂只是一个速度和使能控制但每次调试省下的时间非常多。毕竟焊接参数最终要靠工艺人员来调你得把观察窗口做出来他们才能高效地做判断。