VC++铰链四杆机构运动仿真编程示例
(基于单文档模式的程序实现)
一. 铰链四杆机构的运动分析原理
l
如图 1 所示铰链四杆机构。已知各杆长 l
1
l
,
,
2
3
, ,原动件的位置角1, 其角速度1 为
l
4
常数,且以逆时针方向为正。
求解程序:首先建立机构的位置方程式,求出给定1 时的构件 2、3 的位置角 2
3
, 。
将位置方程分别对时间 t 求导一次、二次,得速度方程式和加速度方程式,并求得各构件的
角速度 2
3
1.位移分析
, 和角加速度 2
3, 。
vM
y
r2
B
φ1
φ
l1
A
ω1
为建立机构的位置方程式,首先画出各构件的
矢量指向(如图 1 所示)。以 x 轴正向沿逆时针方
, 及2 ,由矢量封闭
,
向画出各杆的转角
4
2
回路 ABCD 写出矢量方程
,
1
3
l
1
l
2
l
4
l
3
将上述矢量方程写成坐标方程
M
θ2
v
l2
l
θ4
φ2
l4
C
l3
D
φ3
x
l
1
l
1
cos
sin
1
1
l
l
2
2
cos
sin
2
2
4
l
l
4
cos
4
sin
l
4
l
3
cos
3
3
sin
3
(3-1)
图 1 铰链四杆机构运动分析模型
上述方程的待求量为 2
3
, 。由于该方程为 2
3
, 的非线性方程,为方便起见,在图 1
中加辅助矢量 BD ,即 l,。在封闭矢量回路 ABD 中
及
解得:
l
1
l
1
cos
sin
1
1
l
l
cos
sin
l
l
4
4
l
1
l
l
4
cos
sin
4
4
l
2
1
l
arctan
l
2
4
l
l
4
4
2
ll
41
sin
4
cos
4
cos(
4
1
sin
l
1
cos
l
1
1
1
)
在封闭矢量回路 BCD 中
l
2
l
l
3
及
解得
l
2
l
2
cos
sin
2
2
l
l
cos
sin
l
l
3
3
cos
sin
3
3
cos(
tan
l
2
2
3
)
sin
cos
l
l
2
2
l
2
ll
3
sin
3
cos
l
l
3
l
2
3
3
3
(3-2)
(3-3)
(3-4)
注意:按正切函数求其角度时,应根据函数中分子、分母的正负号判断所在象限后决定。
= cos(
) 3
而 按 余 弦 函 数 求 其 角 度 时 , 如 上 式 中 由 cos(
cos(
BD 线之上;当用 cos(
2.速度分析
) 3 ,故有两个解。当用 cos(
) 3 时为另一解,即 C 点位于 BD 线之下(图 1 中未示出)。
) 3 的 值 求 3 时 , 由 于
) 3 时为图 3-3 中所示的解,即 C 点在
将式(3-1)对 t 求导,注意到
d
1
d
t
1
d,
2
d
t
2
d,
3
d
t
3
,得
sin
l
2
1 1
3
3
3
cos
l
1 1
3
sin
cos
l
sin
cos
l
l
l
1
2
2
1
2
2
2
3
3
(3-5)
为求解方便起见,采用坐标旋转方法。例如求2 时,可将式(3-5)中第一式的3 项
消去,即将坐标系假想按逆时针方向旋转3 ,此时该公式中各转角应加上(-3 ),即可消
去3 。按此法求得2 、3 的公式
)
2
3
sin(
l
1
1
1
3
sin(
)
l
3
2
sin(
l
1
1
1
2
)
sin(
l
2
2
3
3
)
3.加速度分析
将式(3-5)对时间 t 求导,并注意到 d
1
d
t
0
,
d
2
d
t
2
,
d
3
d
t
3
,得
l
1
2
l
2
1
cos
sin
sin
cos
cos
sin
l
l
2 2
2 2
l
l
1
1
2
2
2
2
2
1
2
1
2
2
2
2
l
l
3
3
3
3
cos
sin
sin
cos
l
l
3 3
3 3
3
3
2
3
2
3
同样采用坐标旋转法,可求得2 、3
2
3
1
2
1
cos(
2
)
l
l
2
3
1
3
sin(
l
3
2
)
l
l
l
2
2
3
2
1
sin(
l
2
2
2
cos(
)
cos(
cos(
2
2
2
2
1
2
3
)
)
)
l
2
3
3
1
3
3
3
(3-6)
(3-7)
(3-8)
二. 编程步骤
1. 项目类型选择 MFC AppWizard(exe),项目名取为“FourBar”,在 location 中指定一个工作
路径用于放置程序文件。
2. 在程序向导的第 1 步选择建立一个基于单文档的应用程序,点击“Finish”结束向导。
3. 点击菜单项“Insert → Resource”,插入一个对话框资源,这个对话框将来作为铰链四
杆机构的参数输入窗口。
4. 在参数输入对话框上右键点击,弹出属性对话框,设定其 ID 号为 IDD_PARAMETER,
设定其标题 Caption 为“参数输入对话框”。然后在对话框上添加控件如下图所示,为每一
个控件指定 ID 号。
为各个编辑框控件指定控件的 ID 号:
AB 杆长:IDC_AB_INPUT;
BC 杆长:IDC_BC_INPUT;
CD 杆长:IDC_CD_INPUT; AD 杆长:IDC_AD_INPUT。
5. 为对话框添加一个类:在对话框的空白区域处双击鼠标,弹出 ClassWizard 窗口,在添加
一个新类对话框中点击 OK 按钮,将新类命名为 CParameterDlg,其余选择默认值,点击 OK
按钮确定。
6. 为对话框中的控件添加相应的成员变量:点击菜单“View →ClassWizard”,点击“Member
Variables”标签项,为对话框中的控件添加对应的成员变量如下图所示。
7. 在资源视图(ResourceView)中双击打开主菜单资源 IDR_MAINFRAME,添加顶层菜单
项“输入”,弹出菜单项“铰链四杆机构参数”,并如图设置 ID 号及标题等。
8. 点击菜单“View →ClassWizard” 为菜单项命令添加消息映射函数。在 Class name 中选
择“CFourBarView”类,目标 ID 号中选择“ID_INPUT_SIZE”,在“Messages”中选择
“Command”,双击,弹出“添加成员函数”对话框,点击“OK”,确认函数名为“OnInputSize”。
9. 四杆机构参数包括:各杆长尺寸 ab,bc,cd,ad,曲柄位置角φ1、连杆位置角φ2、摇杆
位置角φ3、机架倾角θ4。
在 CFourBarView 类中定义铰链四杆机构相关的成员变量如下:
public:
//定义与铰链四杆机构相关的数据与变量
double ab;
double bc;
double cd;
double ad;
double sita4;
double angle1;
double angle2;
double angle3;
10. 初始化四杆机构的参数:在 CFourBarView 类的构造函数 CFourBarView ( )中添加初始化
代码:
CFourBarView::CFourBarView()
{
// TODO: add construction code here
ab=300;
bc=600;
cd=600;
ad=500;
sita4=0;
angle1=45;
angle2=0;
angle3=0;
}
11. 在 OnInputSize()函数中输入下面的代码:
//从四杆机构输入对话框中得到四杆机构各参数值
void CFourBarView::OnInputSize()
{
// TODO: Add your command handler code here
//显示四杆机构输入对话框
CParameterDlg FourbarDlg;
//定义 CParameterDlg 类的一个对象
//初始化四杆机构参数输入对话框
FourbarDlg.m_ab=ab;
FourbarDlg.m_bc=bc;
FourbarDlg.m_cd=cd;
FourbarDlg.m_ad=ad;
//从四杆机构参数输入对话框中得到用户输入的各杆长尺寸
if(FourbarDlg.DoModal()==IDOK)
{
ab=FourbarDlg.m_ab;
bc=FourbarDlg.m_bc;
cd=FourbarDlg.m_cd;
ad=FourbarDlg.m_ad;
}
//调用 OnDraw 函数按照用户输入的参数重新绘制四杆机构
Invalidate(TRUE);
}
12. 在 FourBarView.cpp 前面加上 CParameterDlg 类的头文件及科学计算的头文件:
#include "FourBarDoc.h"
#include "FourBarView.h"
#include "ParameterDlg.h"
#include "math.h"
此时编译运行,可以从菜单项中调出凸轮参数输入对话框,并把用户输入的数据保存在
C FourBarView 类中已经定义好的成员变量里面。
14. 在 CCFourBarView 类的成员函数 OnDraw 中计算并画四杆机构。
void CFourBarView::OnDraw(CDC* pDC)
{
CFourBarDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//设置显示区域,及原点位置
CRect rectClient;
GetClientRect(rectClient);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1500,1500);
pDC->SetViewportExt(rectClient.right,-rectClient.bottom);// 设置视口范围
pDC->SetViewportOrg(rectClient.right/2-100,rectClient.bottom/2+50); // 设 置 视 口 原
// 设置 MM_ANISOTROPIC 映射模式
// 设置窗口范围
// 获得当前窗口的客户区大小
点
double pi=3.1415926; // 定义圆周率π
double bx,by,cx,cy;
double L, fai, aa, bb;
angle1=angle1*pi/180; //将角度值转化为弧度值
sita4=sita4*pi/180;
//铰链 B、C 点的坐标
//定义中间变量
L = sqrt(ab * ab + ad * ad - 2 * ab * ad * cos(angle1 - sita4*pi/180));
fai = atan((ad * sin(sita4) - ab * sin(angle1)) / (ad * cos(sita4) - ab * cos(angle1)));
aa = (bc * bc - L * L - cd * cd) / (2 * L * cd);
angle3 = acos(aa) + fai;
bb = (L * sin(fai) + cd * sin(angle3)) / (L * cos(fai) + cd * cos(angle3));
angle2 = atan(bb);
if (bb < 0)
{
angle2 = angle2 + pi;
}
bx = ab * cos(angle1);
by = ab * sin(angle1);
cx = bx + bc * cos(angle2);
cy = by + bc * sin(angle2);