>随着现代智能装备制造领域的快速发展,机械电子化、硬件软件化成为当今工业发展趋势。传统机械凸轮结构简单可靠,但机械凸轮制造的要求和成本高,其形状和轨迹固定,设计调整困难,并且升级机械凸轮、修改凸轮曲线需要改件,改件涉及大量库存,并且周期长、难度大。为解决机械凸轮存在的问题,提出将电子技术与机械凸轮结合,通过构造凸轮曲线模拟机械凸轮的运动轨迹,达到与机械凸轮系统相同的主、从轴之间的相对运动,电子凸轮应运而生。电子凸轮具有精度高、速度快、稳定性好、成本低等优点,广泛应用在包装、印刷、木工、锂电、硅晶等先进制造行业,例如:枕式包装机刀轴与膜轴的运动、飞剪设备刀轴与材料轴的运动、电池方型卷绕机等。电子凸轮逐渐取代机械凸轮,成为工业发展的趋势,在自动化领域有重要意义。
一、直线算法分析 对于涉及到匀速运动、精度要求不高且对运动轨迹要求较少的工业场合,例如:物料处理系统中使用传送带运输物料、直线车削加工、装配线上器件的输送以及直线焊接等场合。这些场合都涉及到直线算法的应用,直线的运动状况是匀速运动,速度曲线是一条平行于X轴的直线,速度恒定,位移均匀增加。直线算法公式内容如下:二、梯形曲线算法分析 对于不需要频繁进行加减速运动的工业场合,例如:搬运机器人在搬运过程中的平稳加减速运动、机器人在自动化生产线上的平稳运动以及在机械系统中控制运动部件动作等场合,这些场合都涉及到梯形曲线算法的应用。梯形曲线分为三个部分:加速段、匀速段、减速段,运动状况是先进行加速运动,再进行匀速运动,最后进行减速运动,速度曲线形状如梯形,不同运动状态下的加速度恒定。梯形曲线算法公式内容如下:加速度段: 匀速度段: 减速度段: 三、三次曲线算法分析 对于不需要频繁加减速运动且速度平滑的工业场合,例如:飞剪作业、工业机器人轨迹规划以及CNC切割等场合,这些场合都涉及到三次曲线算法的应用。三次曲线的运动状况是加速均匀变化,但在起始时刻和结束时刻的加速度不连续,存在冲击现象,速度曲线形状如弓形。三次曲线算法公式内容如下:四、五次曲线算法分析 对于一些需要频繁启停且要缓起缓停的高速运动场合,例如:机械臂快速精准的定位运动、产品装载设备、工业机器人高精度高速度运动和医疗机器人精确平稳手术作业等场合,这些场合都涉及到五次曲线算法的应用。五次曲线的运动状况是加速度没有冲击现象,曲线弯曲程度较大,五次曲线适合模拟一些复杂的运动曲线。五次曲线算法公式内容如下: 五、S型曲线算法分析 对于一些启动和停止过程需要平滑过渡的场合,例如:数控机床的启动和停止的平滑过渡、物料输送带为避免物料的冲出与溢出的启动与停止动作、机器人关节运动等场合,这些场合都涉及到S形曲线算法的应用。S形曲线的运动状况是加减速的运动曲线平滑,没有冲击现象,速度惯性小。S形曲线算法公式内容如下: 六、直接上干货——程序SCL语言 #R_TRIG_Run(CLK := #inParam.Start);#R_TRIG_Init(CLK := #Out.Busy);#Out.Done := NOT #Out.Busy;#Param := #inParam; //参数初始化"FC_L_Init"(Param := #Param,"FC_T3_Init"(Param := #Param,"FC_A3_Init"(Param := #Param,"FC_A5_Init"(Param := #Param,"FC_S7_Init"(Param := #Param,#RefTime := RUNTIME(#Timer); //耗时#Out.Busy := #T < #Tfff; //执行中"FC_L_Port"(Param := #Param,"FC_T3_Port"(Param := #Param,"FC_A3_Port"(Param := #Param,"FC_A5_Port"(Param := #Param,"FC_S7_Port"(Param := #Param,#Pf := ABS(#P1 - #P0); //到达目标位置所需要的距离#Tf := #Pf / #Vm; //到达目标位置所需要的时间#q_0 := #P0 + #Vm * #inT; //输出位置#Pf := ABS(#P1 - #P0); //到达目标位置所需要的距离。#Ta := #Vm / #Am; //加速和减速需要的时间。#Tm := (#Pf - #Am*#Ta**2)/#Vm; //匀速度段需要的时间。#Tf := #Tm + 2 * #Ta; //到达终点位置所需要的时间。//判断梯形速度曲线属于哪一种情况,梯形还是三角?IF #Tf - 2 * #Ta > 0 THEN //能够达到最大速度——梯形;IF #inT <= #Ta THEN //加速段#q_0 := #P0 + 0.5 * #Am * #inT ** 2;ELSIF #inT<=#Tm THEN //匀速段#q_0 := #P0 + 0.5 * #Am * #Ta ** 2 + #Vm * (#inT - #Ta);ELSIF #inT<=#Tf THEN //减速段#q_0 := #P0 + #Pf - 0.5 * #Am * (#Tf - #inT) ** 2;#q_1 := - #Am * (#inT - #Ta - #Tm);#q_0 := #P0 + #Pf - 0.5 * #Am * (0) ** 2;IF #inT <= #Ta THEN //加速段#q_0 := #P0 + 0.5 * #Am * #inT ** 2;ELSIF #inT<=#Tf THEN //减速段#q_0 := #P0 + #Pf - 0.5 * #Am * (#Tf - #inT) ** 2;#q_1 := - #Am * (#inT - #Tf);#q_0 := #P0 + #Pf - 0.5 * #Am * (0) ** 2;#A2 := (3 * #Pf - (2 * #V0 + #V1) * #Tf) / (#Tf ** 2);#A3 := (-2 * #Pf + (#V0 + #V1) * #Tf) / (#Tf ** 3);#q_0 := #A0 + #A1 * #inT + #A2 * #inT ** 2 + #A3 * #inT ** 3;#q_1 := #A1 + 2 * #A2 * #inT + 3 * #A3 * #inT ** 2;#q_2 := 2 * #A2 + 6 * #A3 * #inT;#q_0 := #A0 + #A1 * #Tf + #A2 * #Tf ** 2 + #A3 * #Tf ** 3;#q_1 := #A1 + 2 * #A2 * #Tf + 3 * #A3 * #Tf ** 2;#q_2 := 2 * #A2 + 6 * #A3 * #Tf;#A3 := (20 * (#Pf) - (8 * #V1 + 12 * #V0) * #Tf - (3 * #Acc0 - #Acc1) * #Tf ** 2) / (2 * #Tf ** 3);#A4 := (-30 * (#Pf) + (14 * #V1 + 16 * #V0) * #Tf + (3 * #Acc0 - 2 * #Acc1) * #Tf ** 2) / (2 * #Tf ** 4);#A5 := (12 * (#Pf) - (6 * #V1 + 6 * #V0) * #Tf - (#Acc0 - #Acc1) * #Tf ** 2) / (2 * #Tf ** 5);#q_0 := #A0 + #A1 * #inT + #A2 * #inT ** 2 + #A3 * #inT ** 3 + #A4 * #inT ** 4 + #A5 * #inT ** 5;#q_1 := #A1 + 2 * #A2 * #inT + 3 * #A3 * #inT ** 2 + 4 * #A4 * #inT ** 3 + 5 * #A5 * #inT ** 4;#q_2 := 2 * #A2 + 6 * #A3 * #inT + 12 * #A4 * #inT ** 2 + 20 * #A5 * #inT ** 3;#q_3 := 6 * #A3 + 24 * #A4 * #inT + 60 * #A5 * #inT ** 2;#q_0 := #A0 + #A1 * #Pf + #A2 * #Pf ** 2 + #A3 * #Pf ** 3 + #A4 * #Pf ** 4 + #A5 * #Pf ** 5;#q_1 := #A1 + 2 * #A2 * #Pf + 3 * #A3 * #Pf ** 2 + 4 * #A4 * #Pf ** 3 + 5 * #A5 * #Pf ** 4;#q_2 := 2 * #A2 + 6 * #A3 * #Pf + 12 * #A4 * #Pf ** 2 + 20 * #A5 * #Pf ** 3;#q_3 := 6 * #A3 + 24 * #A4 * #Pf + 60 * #A5 * #Pf ** 2;//首先按最大速度vmax,来计算Ta,Tb,Tj1 Tj2, TvIF (#Vm - #v0) * #Jm < #Am ** 2 THEN#Tj1 := SQRT((#Vm - #v0) / #Jm);#Ta := #Tj1 + (#Vm - #v0) / #Am;IF (#Vm - #v1) * #Jm < #Am ** 2 THEN#Tj2 := SQRT((#Vm - #v1) / #Jm);#Td := #Tj2 + (#Vm - #v1) / #Am;#Tv := #Pf / #Vm - #Ta / 2 * (1 + #v0 / #Vm) - #Td / 2 * (1 + #v1 / #Vm);ELSE //如果不存在匀速段,需要重新计算能否到达最大加速度#delta := (#Am ** 4) / (#Jm ** 2) + 2 * (#v0 ** 2 + #v1 ** 2) + #Am * (4 * #Pf - 2 * #Am / #Jm * (#v0 + #v1));#Ta := (#Am ** 2 / #Jm - 2 * #v0 + #delta ** 0.5) / 2 / #Am;#Td := (#Am ** 2 / #Jm - 2 * #v1 + #delta ** 0.5) / 2 / #Am;#vlim := #v0 + (#Ta - #Tj1) * #alima;WHILE #Ta < 2 * #Tj1 OR #Td < 2 * #Tj2 DO //如果不能到达最大加速度、减少最大速度的值,直到计算出能达到的一个最大加速度值#Am := #Am - #amax_org * 0.1;#delta := (#Am ** 4) / (#Jm ** 2) + 2 * (#v0 ** 2 + #v1 ** 2) + #Am * (4 * #Pf - 2 * #Am / #Jm * (#v0 + #v1));#delta := (#Am ** 4) / (#Jm ** 2) + 2 * (#v0 ** 2 + #v1 ** 2) - #Am * (4 * #Pf - 2 * #Am / #Jm * (#v0 + #v1));#Ta := (#Am ** 2 / #Jm - 2 * #v0 + #delta ** 0.5) / 2 / #Am;#Td := (#Am ** 2 / #Jm - 2 * #v1 + #delta ** 0.5) / 2 / #Am;#vlim := #v0 + (#Ta - #Tj1) * #alima;IF #Ta < 0 OR #Td < 0 THENIF #v0 > #v1 THEN //计算加速度、减速度段#Td := 2 * #Pf / (#v1 + #v0);#Tj2 := (#Jm * #Pf - (#Jm * (#Jm * #Pf ** 2 + (#v1 + #v0) ** 2 * (#v1 - #v0))) ** 0.5) / #Jm / (#v1 + #v0);#vlim := #v1 - (#Td - #Tj2) * #alimd;#Ta := 2 * #Pf / (#v1 + #v0);#Tj1 := (#Jm * #Pf - (#Jm * (#Jm * #Pf ** 2 - (#v1 + #v0) ** 2 * (#v1 - #v0))) ** 0.5) / #Jm / (#v1 + #v0);#vlim := #v0 + (#Ta - #Tj1) * #alima;IF #inT <= #T1 THEN //加加速段#q_0 := #P0 + #v0 * #inT + #Jm * #inT ** 3 / 6;#q_1 := #v0 + #Jm * #inT ** 2 / 2;ELSIF #inT <= #T2 THEN //加速度段#q_0 := #P0 + #v0 * #inT + #alima / 6 * (3 * #inT ** 2 - 3 * #Tj1 * #inT + #Tj1 ** 2);#q_1 := #v0 + #alima * (#inT - #Tj1 / 2);ELSIF #inT <= #T3 THEN //加减速段#T_org := #T3 - #inT; //此阶段的时间#q_0 := #P0 + (#vlim + #v0) * #T3 / 2 - #vlim * (#T_org) + #Jm * (#T_org) ** 3 / 6;#q_1 := #vlim - #Jm * (#T_org) ** 2 / 2;ELSIF #inT <= #T4 THEN //匀速段#q_0 := #P0 + (#vlim + #v0) * #Ta / 2 + #vlim * (#inT - #T3);ELSIF #inT <= #T5 THEN //减加速段#q_0 := #P1 - (#vlim + #v1) * #Td / 2 + #vlim * (#T_org) - #Jm * (#T_org) ** 3 / 6;#q_1 := #vlim - #Jm * (#T_org) ** 2 / 2;#q_2 := - #Jm * (#T_org);ELSIF #inT < #T6 THEN //减速度段#T_org := #inT - #T7 + #Td;#q_0 := #P1 - (#vlim + #v1) * #Td / 2 + #vlim * (#T_org) - #alimd / 6 * (3 * (#T_org) ** 2 - 3 * #Tj2 * (#T_org) + #Tj2 ** 2);#q_1 := #vlim - #alimd * (#T_org - #Tj2 / 2);ELSIF #inT <= #T7 THEN //减减速段#q_0 := #P1 - #v1 * (#T_org) - #Jm * (#T_org) ** 3 / 6;#q_1 := #v1 + #Jm * (#T_org) ** 2 / 2;#q_2 := - #Jm * (#T_org);#q_0 := #P1 - #v1 * (#T_org) - #Jm * (#T_org) ** 3 / 6;#q_1 := #v1 + #Jm * (#T_org) ** 2 / 2;#q_2 := - #Jm * (#T_org);
|