西门子S7-1200 PLC结构化文本进阶:用ST实现复杂多轴运动插补
S7-1200做多轴插补要先看硬件固件:普通1200建多个定位轴工艺对象,可分别用MC_MoveAbsolute/Relative做单轴定位,复杂直线/圆弧多轴协同优先用S7-1200 G2“运动机构”工艺对象;非G2老CPU可用ST自写微线段插补,把圆弧离散成小直线再逐轴下目标。
一、G2运动机构:直线+圆弧原生插补
TIA里建2D/3D Cartesian运动机构,绑X/Y/Z定位轴,程序用MC_MoveLinearAbsolute、MC_MoveCircularAbsolute下TCP目标,正向运动学由工艺对象分解到各轴。
// 使能运动机构与轴后在自动OB调用
"MC_Power"(Axis:="KIN_X", Enable:=TRUE);
"MC_Power"(Axis:="KIN_Y", Enable:=TRUE);
"MC_MoveLinearAbsolute"(Kinematics:="KIN_Grp",
Position:=[100.0, 50.0], Velocity:=200.0,
Acceleration:=800.0, Deceleration:=800.0,
Jerk:=4000.0, BufferMode:=1, Done=>#LinDone);
"MC_MoveCircularAbsolute"(Kinematics:="KIN_Grp",
CircMode:=1, AuxPoint:=[cx, cy], EndPoint:=[ex, ey],
CirclePlane:=0, Arc:=90.0, PathChoice:=0,
Velocity:=150.0, Acceleration:=600.0,
Deceleration:=600.0, BufferMode:=2, Done=>#ArcDone);
CircMode=0用中间点+终点,=1用圆心+角度,=2用半径+终点;BufferMode=2做过渡混合,连续轨迹不停车。 每个运动机构对象还会占用扩展运动控制资源,选型时按轴数和路径数留余量。
二、非G2自写ST插补:直线归一化
老1200没有运动机构时,用独立定位轴+路径队列,OB35按固定周期算各轴增量,再调MC_MoveRelative;不自己写脉冲,只算目标位置,避免破坏工艺对象状态字。
TYPE StPath : STRUCT
x, y, z : LREAL;
v, acc : REAL;
segType : INT; // 0直线 1圆弧
cx, cy : LREAL; // 圆弧圆心
arcDeg : REAL;
END_STRUCT; END_TYPE
FUNCTION_BLOCK FB_LineInterp
VAR_INPUT cur : StPath; startX,startY,startZ : LREAL; cycleMs : REAL; END_VAR
VAR_OUTPUT stepX,stepY,stepZ : LREAL; busy : BOOL; END_VAR
VAR dx,dy,dz,len,inv : LREAL; END_VAR
dx := cur.x - startX; dy := cur.y - startY; dz := cur.z - startZ;
len := SQRT(dx*dx + dy*dy + dz*dz);
IF len <= 1e-6 THEN busy:=FALSE; RETURN; END_IF;
inv := 1.0 / len;
// 按合成速度、扫描周期算本周期各轴位移
stepX := dx*inv * cur.v * cycleMs/1000.0;
stepY := dy*inv * cur.v * cycleMs/1000.0;
stepZ := dz*inv * cur.v * cycleMs/1000.0;
busy := TRUE;
主程序把stepX/stepY/stepZ累加为绝对目标,分别下给X/Y/Z的MC_MoveAbsolute;用同一BufferMode和公共速度规划,保证各轴同时到达。
三、圆弧离散为微直线
ST不自己算插补器时,最稳是把圆弧按弦高误差切成N段直线:
FOR i := 0 TO n-1 DO
a := startAng + (arcDeg/n)*(i+1);
px := cx + r*COS(a*3.14159/180.0);
py := cy + r*SIN(a*3.14159/180.0);
pathQueue[ix].segType := 0; pathQueue[ix].x := px; pathQueue[ix].y := py;
ix := ix + 1;
END_FOR;
段数按“半径×角度/允许弦高”估算,普通铣削/点胶0.01~0.05mm弦高足够;段太短会增加MC调用频次,OB35建议2ms、运动控制OB别混重逻辑。
四、多轴衔接与同步替代
连续小线段别每段等Done再发下一段,否则必停顿。G2用BufferMode+TransitionParameter做blending; 自写方案用“剩余距离<减速距离”提前装载下一段目标。主从关系而非空间插补时,不用微线段,直接用MC_GearIn电子齿轮或MC_CamIn凸轮,主轴位置折算从轴,PROFINET周期与伺服更新对齐,避免累积误差。
五、调试避坑
回零必须先用MC_Home建立各轴参考点,绝对插补才有意义; 多轴使能用独立MC_Power实例,Status未TRUE不触发运动。Trace抓X/Y实际位置、跟随误差、Busy/Done,拐角超差先降Jerk和Velocity,再查电子齿轮比、软限位、PTO频率。 弱刚性机构用S曲线而非梯形,BufferMode过渡距离按段长5%~10%试凑;G2运动机构占用扩展资源,笛卡尔4轴以内按官方资源表留余量。
按“G2运动机构做原生直线/圆弧、老1200用ST微线段+单轴MC、主从用齿轮/凸轮”的分层思路,三轴点胶、双轴焊接、四轴门户搬运都能在S7-1200上稳定跑出连续轨迹,而不靠外部PC算G代码。





