1.课程目标及目录
这节课内容应该算是整个电子凸轮入门应用中最最最重要的课程了。这节课和视频的第7讲讲的实际上是一件事情,只是由于课程时长太长所以将视频拆分成2节课进行讲解。而文字版的教案呢,就放到一篇帖子里写清楚
本节课程的学习目标:
1.理解为啥要修改电子凸轮的关键点
2.了解电子凸轮修改的几种常见方法
3.实现电子凸轮关键点的动态修改
本节课程内容,相当相当相当重要,希望大家能自己完成凸轮表关键点的修改仿真调试。
2.为啥要修改凸轮关键点
原因是:为了满足客户的设备工艺需求。我们来看看下面这个案例:
上面这个视频呢,是我在冷切制袋机上的一个应用。客户端需要的是切圆角的工艺(行业内称R角)
行业内,圆角方案有2种:CCD单切视觉打圆角 和 双切移刀打圆角。
CCD摄像头比较贵,高端机型才用。双切移刀方案是常规方案,方案需要切刀动2下,第二次需要移刀动作然后再切再复原。
第一周期不动,第二周期移刀移过去再移回来,而且要求移刀移动的距离可设,可修改,那么这里就需要更改凸轮曲线从轴(移刀轴的)运动距离了,1mm,2mm,3mm等
我在例程中详细的写了7种方式的程序:
dChangeMode : DINT := 1; //= 1.切换凸轮表静态切换 = 2.切换凸轮表,末点切换
//= 3.凸轮末点修改关键点,下一周期生效 = 4.凸轮修改关键点,当前周期生效
//= 5.修改关键点个数 = 6.修改首末关键点点位置,重新触发MC_TableSelect
//= 7.使用程序新建电子凸轮
3.凸轮曲线修改原则
什么是好的凸轮曲线?
答:适合的凸轮曲线就是好的凸轮曲线。
什么样算“适合”?
(1)满足精度要求的
(2)满足效率要求
(3)满足工艺功能要求
(4)噪音小,运行流畅的
引用自“工控小学生”
4.切换凸轮表的方法
1.首先我们需要明确我们要实现的功能
2.设置主轴和从轴参数,主轴和从轴使能
3.新建多个工艺需求电子凸轮表
4.凸轮曲线的绑定(MC_CamTableSelect )
5.电子凸轮表单周期解析(MC_CamIn)
6.给主轴一个速度匀速运动。
7.根据工艺需求,程序中切换电子凸轮表
8.需要重新触发MC_CamTableSelect ,不需要触发MC_CamIn
5.修改凸轮关键点
5.1凸轮表的数据结构
5.2修改凸轮表数组的方法
我们一般的修改方式两种:
A.凸轮末点信号触发,这个扫描周期进行电子凸轮关键点写入;
B.使用IF语句,修改时不修改当前运行段两端的凸轮关键点,讲解如下:
运行中修改(4个关键点)
1.如果当前运行在1和2关键点之间段,则可以修改第3个关键点
2.如果当前运行在3和4关键点之间段,则可以修改第2个关键点
修改首末关键点的方法:
修改凸轮表数组最后一个关键点的数据,然后再触发MC_CamTableSelect
CASE语句的代码片段如下
3://= 3,凸轮末点修改关键点,下一周期生效
xCamTable := Cam_1mm;
IF FB_CamIn.EndOfProfile THEN
//----第一个关键点-------------------------------
Cam_1mm_A[0].dX := 0;
Cam_1mm_A[0].dY := 0;
Cam_1mm_A[0].dV := 0;
//----第二个关键点-------------------------------
Cam_1mm_A[1].dX := 360;
Cam_1mm_A[1].dY := 0;
Cam_1mm_A[1].dV := 0;
//----第三个关键点-------------------------------
Cam_1mm_A[2].dX := 440;
Cam_1mm_A[2].dY := fDistance;
Cam_1mm_A[2].dV := 0;
//----第四关键点---------------------------------
Cam_1mm_A[3].dX := 640;
Cam_1mm_A[3].dY := fDistance;
Cam_1mm_A[3].dV := 0;
//----第五关键点---------------------------------
Cam_1mm_A[4].dX := 720;
Cam_1mm_A[4].dY := 0;
Cam_1mm_A[4].dV := 0;
END_IF
4://= 4,当前凸轮周期,非运行段凸轮修改关键点,当前周期生效
xCamTable := Cam_1mm;
IF (Master.fSetPosition > 360.0) AND (Master.fSetPosition < 440.0) THEN
//----当前运行在,第2,3关键点,可以修改第4个关键点数据-------------------
Cam_1mm_A[3].dX := 640;
Cam_1mm_A[3].dY := fDistance;
Cam_1mm_A[3].dV := 0;
ELSIF (Master.fSetPosition < 360.0) OR (Master.fSetPosition > 640.0) THEN
Cam_1mm_A[2].dX := 440;
Cam_1mm_A[2].dY := fDistance;
Cam_1mm_A[2].dV := 0;
END_IF
5: //= 5.凸轮末点修改 凸轮关键点个数,不修改首末关键点,不需要重新触发MC_CamTableSelect
xCamTable := Cam1;
IF FB_CamIn.EndOfProfile AND bTest THEN
Cam1.nElements := 2;
//---设置凸轮关键点个数为2-----------------
Cam1_A[0].dX := 0;
Cam1_A[0].dY := 0;
Cam1_A[0].dV := 0;
Cam1_A[0].dA := 0;
Cam1_A[1].dX := 360;
Cam1_A[1].dY := 360;
Cam1_A[1].dV := 0;
Cam1_A[1].dA := 0;
ELSIF FB_CamIn.EndOfProfile AND NOT bTest THEN
//---设置凸轮关键点个数为4-----------------
Cam1.nElements := 4;
Cam1_A[0].dX := 0;
Cam1_A[0].dY := 0;
Cam1_A[0].dV := 0;
Cam1_A[0].dA := 0;
Cam1_A[1].dX := 120;
Cam1_A[1].dY := 120;
Cam1_A[1].dV := 1;
Cam1_A[1].dA := 0;
Cam1_A[2].dX := 240;
Cam1_A[2].dY := 240;
Cam1_A[2].dV := 1;
Cam1_A[2].dA := 0;
Cam1_A[3].dX := 360;
Cam1_A[3].dY := 360;
Cam1_A[3].dV := 0;
Cam1_A[3].dA := 0;
END_IF
6://= 6,修改首末关键点位置需要重新触发MC_TableSelect
xCamTable := Cam1;
bEndOk := FALSE;
//---5.改首末关键点的位置,需要重新触发MC_CamTableSelect,否则速度突变
IF FB_CamIn.EndOfProfile AND bEndPoint THEN
Cam1_A[3].dX := 360;
Cam1_A[3].dY := 180;
Cam1_A[3].dV := 0;
Cam1_A[3].dA := 0;
//---重新触发标志位-----------------------------------------------------------------
bEndOk := TRUE;
END_IF
6.使用程序新建电子凸轮
7://使用程序新建电子凸轮表
IF bCamInit THEN
//----程序新建凸轮表对应的关键点的数据结构,我们新建4个关键点
axCamPointXYVA[0].dX := 0;
axCamPointXYVA[0].dY := 0;
axCamPointXYVA[0].dV := 0;
axCamPointXYVA[0].dA := 0;
axCamPointXYVA[1].dX := 120;
axCamPointXYVA[1].dY := 120;
axCamPointXYVA[1].dV := 1;
axCamPointXYVA[1].dA := 0;
axCamPointXYVA[2].dX := 240;
axCamPointXYVA[2].dY := 240;
axCamPointXYVA[2].dV := 1;
axCamPointXYVA[2].dA := 0;
axCamPointXYVA[3].dX := 360;
axCamPointXYVA[3].dY := 360;
axCamPointXYVA[3].dV := 0;
axCamPointXYVA[3].dA := 0;
END_IF
//----程序新建一个凸轮表-----------------------------
MC_CamTableByHand(
wCamStructID:= , //此功能用于检查输入的数据结构是否为 MC_CAM_REF类型的。
byType:= 3, //1 一维数组 2 二维数组 3多项式插值xyva
byVarType:= , //只在 byType=1 或者 byType=2时使用 1: INT 2: UINT 3: DINT 4: UDINT 5: REAL 6: LREAL
xStart:= 0, //凸轮表主轴起点位置
xEnd:= 360, //主轴末点位置
nElements:= 4, //关键点的个数
nTappets:= , //挺杆开关动作序号
pce:= ADR(axCamPointXYVA), //关键点的数组地址
pt:= ,
dwTappetActiveBits:= ,
strCAMName:= 'MC_CamTableByHand',
byInterpolationQuality:= ,
byCompatibilityMode:= ,
bChangedOnline:= ,
xPartofLM:= ); //是否是通过后台软件创建,我们是程序手动创建的,所以不填就好了,这个是用来管理的
//----程序中动态修改关键点
IF FB_CamIn.EndOfProfile AND bCamModifyByHand THEN
//
axCamPointXYVA[0].dX := 0;
axCamPointXYVA[0].dY := 0;
axCamPointXYVA[0].dV := 0;
axCamPointXYVA[0].dA := 0;
axCamPointXYVA[1].dX := 120;
axCamPointXYVA[1].dY := 150;
axCamPointXYVA[1].dV := 1;
axCamPointXYVA[1].dA := 0;
axCamPointXYVA[2].dX := 240;
axCamPointXYVA[2].dY := 220;
axCamPointXYVA[2].dV := 1;
axCamPointXYVA[2].dA := 0;
axCamPointXYVA[3].dX := 360;
axCamPointXYVA[3].dY := 360;
axCamPointXYVA[3].dV := 0;
axCamPointXYVA[3].dA := 0;
END_IF
xCamTable := MC_CamTableByHand;
7.练习题