凸轮表生成功能块 DFB_CamGenerate 技术解析

凸轮表生成功能块实现详解

程序结构

功能块采用结构化编程,主要包含以下部分:

完整程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
FUNCTION_BLOCK DFB_CamGenerate

VAR_IN_OUT
// 凸轮表命名
Cam: MC_CAM_REF;
END_VAR
VAR_INPUT
// 启动
bExecute: BOOL;
// 凸轮关键点数
iCamPointCount: INT;
// 凸轮主轴长度
lrCutLen: LREAL;
// 主轴各个点位位置
CamMasterPos: ARRAY[0..10] OF LREAL;
// 从轴各个点位位置
CamSlavePos: ARRAY[0..10] OF LREAL;
// 从轴各个点位速度
CamSlaveVel: ARRAY[0..10] OF LREAL;
// 从轴各个点位加速度
CamSlaveAcc: ARRAY[0..10] OF LREAL;
END_VAR
VAR_OUTPUT
// 报警信号
bError: BOOL;
bDone: BOOL;
END_VAR

VAR
Table: ARRAY[0..20] OF ARRAY[0..3] OF LREAL;
i: INT;
n: INT;
R_TRIG1: R_TRIG;
T1: TON;
END_VAR
VAR_STAT
wErrorID: INT;
END_VAR
VAR_INPUT
bReset: BOOL;
R_TRIG2: R_TRIG;
END_VAR

//********************凸轮表生成功能块********************
R_TRIG1(CLK:=bExecute );
T1(IN:=bDone, PT:=T#10MS , Q=> , ET=> );

IF T1.Q
THEN
bDone :=FALSE;
END_IF

IF R_TRIG1.Q
THEN
bDone :=FALSE;
IF lrCutLen<=0 OR iCamPointCount<=1 OR CamMasterPos[iCamPointCount-1]<>lrCutLen
THEN
bError :=TRUE;
wErrorID :=1;
ELSE
FOR i:=1 TO (iCamPointCount-1) BY 1 DO
IF CamMasterPos[i]<= CamMasterPos[i-1]//凸轮点位参数合理性判断
THEN
bError :=TRUE;
wErrorID :=2;
END_IF
END_FOR
IF (NOT bError)
THEN
FOR n:=0 TO (iCamPointCount-1) BY 1 DO
Table[n][0] := CamMasterPos[n];
Table[n][1] := CamSlavePos[n];
Table[n][2] := CamSlaveVel[n];
Table[n][3] := CamSlaveAcc[n];
END_FOR
Cam.nElements :=iCamPointCount;
Cam.byType :=3;
Cam.byVarType :=6;
Cam.xStart :=0.0;
Cam.xEnd :=lrCutLen;
Cam.pce :=ADR(Table);
bDone :=TRUE;
END_IF
END_IF
END_IF

R_TRIG2(CLK:=NOT bExecute , Q=> );

IF R_TRIG2.Q
THEN
bError :=FALSE;
bExecute :=FALSE;
END_IF

主要功能实现

1. 参数校验

程序首先对输入参数进行有效性检查:

1
2
3
4
IF lrCutLen<=0 OR iCamPointCount<=1 OR CamMasterPos[iCamPointCount-1]<>lrCutLen THEN
bError := TRUE;
wErrorID := 1;
END_IF

2. 凸轮表生成

通过循环遍历所有点位,生成凸轮表数据:

1
2
3
4
5
6
FOR n:=0 TO (iCamPointCount-1) BY 1 DO
Table[n][0] := CamMasterPos[n];
Table[n][1] := CamSlavePos[n];
Table[n][2] := CamSlaveVel[n];
Table[n][3] := CamSlaveAcc[n];
END_FOR

3. 凸轮表配置

设置凸轮表参数:

1
2
3
4
5
6
Cam.nElements := iCamPointCount;
Cam.byType := 3;
Cam.byVarType := 6;
Cam.xStart := 0.0;
Cam.xEnd := lrCutLen;
Cam.pce := ADR(Table);

使用说明

输入参数

参数名 类型 说明
bExecute BOOL 执行信号
iCamPointCount INT 凸轮关键点数
lrCutLen LREAL 凸轮主轴长度
CamMasterPos ARRAY[0..10] OF LREAL 主轴点位位置
CamSlavePos ARRAY[0..10] OF LREAL 从轴点位位置
CamSlaveVel ARRAY[0..10] OF LREAL 从轴点位速度
CamSlaveAcc ARRAY[0..10] OF LREAL 从轴点位加速度

输出参数

参数名 类型 说明
bError BOOL 错误标志
bDone BOOL 完成标志

应用场景

本功能块适用于以下场景:

  1. 包装机械的同步控制
  2. 印刷机械的套色控制
  3. 纺织机械的张力控制
  4. 自动化装配线的同步运动

注意事项

  1. 确保输入的主轴长度与最后一个点位位置一致
  2. 主轴点位必须按升序排列
  3. 从轴参数需与主轴点位一一对应
  4. 建议在使用前进行参数校验