企业: | 控制网 | 日期: | 2009-08-27 |
---|---|---|---|
领域: | PLC&PAC | 点击数: | 664 |
在塑料机械行业中,运动机构的控制往往由液压驱动来实现,比如注塑机的开合模位置,注射位置,全自动中空吹塑机的移模位置等等。 这些运动机构的位置准确性对于机器的整体性能和制品精度都有较大影响,比如,注塑机开模位置的准确度,有利于机械手进入取出成品,注射终的位置也会影响到注射量和成品的重复精度。 为了提高位置精度,比较有效的做法是提高执行机构的响应和精确度,使用高精度的比例阀或伺服阀。MOOG,REXROTH,意大利的ATOS,都有相应的液压驱动产品。 然而,作为机器的中央控制单元 – 塑料机械的控制系统,软件内的传统做法是:检测电子尺的位置反馈,判断动作处于第几个阶段,决定输出相应的流量和压力,或者是否要结束动作。 这种做法的缺点是,比如,控制系统检测到模板位置已经达到了设定的开模终的位置,然后流量和压力才开始按照设定斜坡减速,再加上阀的响应延时,等到模板停稳之后,实际位置已经远远超过了设定值。 图1是普通注塑机控制系统控制开模位置的效果示意图,可以看到,就算使用高响应比例方向阀,过冲仍不可避免,而当执行机构的响应特性较差时,情况就更加糟糕。
图 2 以图2 曲线为例,V1,V2,V3为三段恒定速度,Q1,Q2为两点位置值,要实现这样的点到点位置曲线,必须要考虑中间的加减速过程。图例中为:先实现一段上升斜坡,然后再实现两段下降斜坡。对于塑料机械来说,上升斜坡采用基于时间的类型就能满足要求:(速度变化△V) * 程序运行周期时间T_PLC / 加速时间T = 每隔一个程序运行周期需要增加的速度输出变化。这样的基于时间的加速斜坡算法很轻易就能实现,而对于下降斜坡,要准确的停在Q1位置,必须提前一定位置就进行减速,这个提前位置系数,取决于执行机构的响应速度,执行机构响应越快,这个值就可以设得越小,否则必须增大提前位置系数,从而延长运动过程的执行时间。 程序实现这样的减速过程,至少有三种不同的算法可能性,让我们分析各自优劣性。 第一种,基于时间 if (STOP_POSITION[i] == TIME_BASED){ if( Realpos > startPos) { if (StartDecreaseOut[i] > TimeRampValue [i]) { StartDecreaseOut [i] = StartDecreaseOut [i] – TimeRampValue[i]; }else{ StartDecreaseOut [i] = 0; } OutPutTemp = StartDecreaseOut [i]; }else{ StartDecreaseOut [i] = Real_Output; } return(OutPutTemp); } 这种算法和加速斜坡类似,但存在一个致命缺点:由于起始下降的速度未定,就算机器出厂前设好了参数,最终用户更换模具,或者改变开模速度曲线,都需要重新寻找最佳的斜坡起始点,因此,不能拿来用做控制。 第二种,基于位置斜坡
if (STOP_POSITION == POSITION_RAMP_BASED){ Position_Ramp = AdvancePoint * Real_Output / Maxout; If (Realpos > startPos) { OutTemp = Maxoutabs * (EndPos - RealPos) / Position_Ramp; if (Real_Output <= OutTemp) OutPutTemp = Real_Output; } return(OutPutTemp); } 注释( STOP_POSITION:斜坡方式选项 POSITION_RAMP_BASED:基于位置斜坡方式 AdvancePoint:提前开始降速的位置 Position_Ramp:斜坡比例 Realpos :电子尺的当前实际位置 startPos:开始执行斜坡降速的电子尺位置 OutTemp:中间变量,流量 Real_Output:实际输出流量 ) 第三种,基于位置斜坡和数组阵列排点法 第三种算法是在第二种的基础上加以改进和优化 在第二种控制方法中没有解决开始执行斜坡的位置确定问题,这可以借助数组阵列排点法解决。比如预先定义一个32点的数组,表内的数值决定了最终运动曲线的形状,如果我们把每一个点在坐标轴上列出来,就可以很清晰的看到它是一条线形的直线,上凸弧线,下凹弧线,或者是S型的曲线。比如16位的输出最大点值32767,可以将其划分成32段, EXTERN int TAB_POS [33] = { 0, 3913, 6330, 8242, 9882, 11331, 12651, 13875, 15012, 16076, 17092, 18060, 18981, 19869, 20717, 21541, 22341, 23110, 23862, 24598, 25310, 25998, 26679, 27343, 27991, 28631, 29247, 29863, 30463, 31056, 31632, 32200, 32767 } 程序内可以用简单的FOR循环语句,实时获取预先定义好的斜坡曲线形状,计算分段位置值,然后根据实际位置值,修正速度输出。 if (STOP_POSITION == POSITION_RAMP_ARRAY__BASED){ For (int j = 0; j <= 32; j++) { TableTemp[j] = TAB_POS[j]; } DeltaStop = EndPos – RealPos; Temp1 = AdvancePoint / 32; if (DeltaStop > AdvancePoint) { stepg = 31; restg = Temp1; } else { stepg = DeltaStop * 32 / AdvancePoint; restg = AdvancePoint / 32 * stepg; restg = DeltaStop - restg; } Temp2 = TableTemp [stepg+1] - TableTemp [stepg]; OutPutTemp = restg * Temp2 / Temp1; OutPutTemp = OutPutTemp + TableTemp [stepg]; return(OutPutTemp); } 注释( STOP_POSITION:斜坡方式选项 POSITION_RAMP_ARRAY__BASED:基于数组阵列排点的位置斜坡方式 AdvancePoint:提前开始降速的位置 TableTemp:获取预定义数组的本地变量 TAB_POS:预先定义好的数组阵列 Temp1:中间变量,将提前位置按阵列数等分 Temp2:中间变量,将位置值映射成流量值 RealPos:电子尺的当前实际位置 EndPos:最终开模位置 DeltaStop:剩余需要走完多少位置值 stepg:当前采样点模板位置处于第几步阵列 restg:剩余采样点共有几步阵列 ) 另外需要考虑的一点是,当执行程序的控制器的循环周期时间过长,阵列细分过少,或阀门开度不准确等原因,造成速度下降至零时停止在了位置设定值之前,此时需要有一个最小速度值,保证在这种情况下,能够继续前进至目标位置。
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
1.我有以下需求: | |
|
|
2.详细的需求: | |
* | |
姓名: | * |
单位: | |
电话: | * |
邮件: | * |