ACR控制器上位机程序开发MFCWord格式文档下载.docx
- 文档编号:21491931
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:34
- 大小:452.56KB
ACR控制器上位机程序开发MFCWord格式文档下载.docx
《ACR控制器上位机程序开发MFCWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《ACR控制器上位机程序开发MFCWord格式文档下载.docx(34页珍藏版)》请在冰豆网上搜索。
单击“OK”按钮,完成动态链接库的添加。
方法2:
采用Import加载类库文件。
在StdAfx.h加入下面这条语句:
#import"
..\ComACRsrvr.tlb"
no_namespacenamed_guids
要将ComACRsrvr.tlb文件放到工程文件的外面。
如下图示:
三、初始化工作
我们可以参考Parker为我们提供的demo程序,比如MFCJOG,打开“FindInFiles”对话框,在“Findwhat”中输入“**ADDAD**”,来查看编程人员自己添加的内容。
下面我们开始编写自己的MFC程序
1.在CACR9000App类的InitInstance()成员函数中添加下段代码:
AfxOleInit();
如图3-1所示:
这一步是COM组件初始化所必须的。
图3-1
2.添加ReadStatus类
为了方便我们读取控制器中的数据,Parker为我们提供了ReadStauts类。
ReadStatus.cpp及ReadStatus.h文件可以在Parker提供的demo程序中找到,并将其拷贝到工程所在文件夹(ACR9000)下。
下面我们把这两个文件加入到自己的工程中。
依次选择菜单项“Project”->
“AddToProject”->
“Files”,如图3-2示:
图3-2
从弹出的对话框中选则ReadStatus.cpp及ReadStatus.h文件并选中,单击“OK”按钮,如图3-3示:
这样ReadStatus类就加入到我们的工程中。
图3-3
3.添加头文件
在ACR9000Dlg.cpp文件中包含“ReadStatus.h”文件。
如图3-4示:
#include"
ReadStatus.h"
图3-4
在ACR9000Dlg.h文件中包含“ComACRsrvr.h”文件及ReadStatus类的声明。
如图3-5示:
ComACRsrvr.h"
classReadStatus;
图3-5
4.创建对象
首先,在CACR9000Dlg类中添加三个指针型成员变量,分别指向IControl、IStatus接口及ReadStatus对象:
如图3-6所示:
IControl*m_Cntl;
IStatus*m_Stat;
ReadStatus*m_workerEvent;
图3-6
创建智能指针对象:
在CACR9000Dlg类中添加智能指针成员变量
CComQIPtr<
IControl>
m_Cntl;
IStatus>
m_Stat;
智能指针对象可以自动回收内存
之后,在CACR9000Dlg的构造函数中加入接口对象创建的代码:
如图3-7示:
m_Cntl=newIControl;
m_Cntl->
CreateDispatch(_T("
BoxBridge.Control.1"
));
m_Stat=newIStatus;
m_Stat->
BoxBridge.Status.1"
m_workerEvent=NULL;
图3-7
智能指针对象创建
在CACR9000Dlg的构造函数中加入下面代码
CComPtr<
IUnknown>
spUnknown1;
spUnknown2;
spUnknown1.CoCreateInstance(CLSID_Status);
spUnknown2.CoCreateInstance(CLSID_Control);
if(spUnknown1)
{
m_Stat=spUnknown1;
}
if(spUnknown2)
m_Cntl=spUnknown2;
}
下面我们为CACR9000Dlg类添加析构函数
~CACR9000Dlg();
在析构函数中我们要用delete关键字清理对象。
如图3-8示:
CACR9000Dlg:
:
~CACR9000Dlg()
{
if(m_Cntl){
deletem_Cntl;
if(m_Stat){
deletem_Stat;
if(m_workerEvent){
deletem_workerEvent;
}
图3-8
智能指针对象的释放:
在析构函数中清理对象
if(m_Cntl){
Disconnect();
m_Cntl.Release();
m_Stat->
m_Stat.Release();
Release是关键
5.添加自定义消息
下面我们添加用户自定义消息,该消息相应函数用来实时的读取控制器数据(如位置反馈等)。
首先,在StdAfx.h文件中加入消息定义代码,如图3-9示:
#defineWMU_UpdateStats(WM_USER+1)
图3-9
下面我们添加消息相应函数的声明,在CACR9000Dlg.h文件中添加下面代码,如图3-10示:
afx_msgLONGOnUpdateStats(UINT,LONG);
图3-10
下面我们在CACR9000Dlg.cpp文件中加入消息映射函数,如图3-11示:
ON_MESSAGE(WMU_UpdateStats,OnUpdateStats)
图3-11
最后,在CACR9000Dlg.cpp文件中添加消息响应函数,如图3-12示:
图3-12
最后,在StdAfx.h文件中增加下面代码,如图3-13示:
#include<
atlbase.h>
CComModule_Module;
atlcom.h>
string>
/
sstream>
图3-13
四、连接控制器
我们在对话框编辑器上添加两个按钮控件及一个静态文本控件,如图4-1示:
图4-1
各控件属性设置如下:
控件名称
Captain
ID
功能
按钮
连接
IDC_BT_CONNECT
连接控制器
断开
IDC_BT_DISCONNECT
断开控制器的连接
静态文本
未连接
IDC_LB_ISOFFLINE
显示控制器连接状态
将静态文本控件关联一个字符串型变量“m_isOffline”,如图4-2示:
并在CACR9000Dlg类的构造函数中将该变量初始值设为“未连接”。
图4-2
我们在连接按钮的响应函数“OnBtConnect”中添加连接控制器的代码:
UpdateData();
try
SetBstrIP("
192.168.10.40"
);
//在应用程序中设置所连接的控制//器的IP地址
//所有的接口都需要进行连接
Connect(3,0);
//与控制器通过以太网进行连接
if(!
m_Cntl->
GetIsOffline()&
&
!
GetIsOffline())//判断控//制器是否离线(连接成功)
m_isOffline="
控制器连接成功!
"
+m_Stat->
GetBstrVersion();
//如//果连接成功,则对话框上显示“控制器连接成功”及版本号
else
m_isOffline="
未连接!
;
UpdateData(false);
m_workerEvent=newReadStatus(this);
//创建ReadStatus类对象
}catch(COleDispatchException*e){//加入异常处理过程
ostringstreamerrmsg;
unsignedshorterrnbr=e->
m_scError;
errmsg<
<
"
ERRORNO:
<
hex<
e->
m_scError<
dec<
("
errnbr<
)\nERRORDESC:
string(e->
m_strDescription)<
\nERRORINTERFACE:
m_strSource);
MessageBox(errmsg.str().c_str(),"
COMError"
MB_OK);
catch(CException*e){
TCHARszCause[1024];
e->
GetErrorMessage(szCause,1024);
MessageBox(szCause,"
non-COMError"
}
采用智能指针对象,个别函数参数需要稍微修改一下:
bstrIP="
//在应用程序中设置所连接的控制器的IP地址
异常处理:
使用标准的COM异常处理方法
}catch(_com_error&
e){
MessageBox(e.Description(),"
在“断开”按钮的响应函数中添加下面代码:
UpdateData();
//断开连接
if(m_Cntl->
GetIsOffline())
未连接"
我们编译运行程序,当单击“连接”按钮后,界面如图4-3示:
图4-3
当连接出错,将弹出异常提示,如图4-4示:
图4-4
下面我们来添加JOG运动功能块。
完成界面如图4-5示:
我们添加的控件详细信息见下表:
图4-5
关联变量名称
关联变量类型
组框
IDC_STATIC
JOG运动
JOG运动组框
无
单选框
IDC_RA_AXIS0
轴0(勾选Group选项)
选择轴0执行JOG运动
m_chooseAxis
int
IDC_RA_AXIS1
轴1
选择轴1执行JOG运动
IDC_RA_AXIS2
轴2
选择轴2执行JOG运动
IDC_RA_AXIS3
轴3
选择轴3执行JOG运动
标签
JOG速度设置(转/s)
标签功能
文本框
IDC_ED_JOGVEL
设置JOG运动速度
m_jogVel
float
IDC_BT_JOGVEL
设置
IDC_BT_JOGFWD
JOG+
JOG正向运动
IDC_BT_JOGSTOP
JOG停
JOG运动停止
IDC_BT_JOGREV
JOG-
JOG反向运动
控制电机JOG运动可以通过触发ACR9000控制器内部的BIT位来实现。
JOG速度设置可以通过对内部P参数赋值来实现,对应关系如下:
轴0:
JOG+BIT796;
JOG-BIT797速度:
P12348
轴1:
JOG+BIT828;
JOG-BIT829速度:
P12604
轴2:
JOG+BIT860;
JOG-BIT861速度:
P12860
轴3:
JOG+BIT892;
JOG-BIT893速度:
P13116
在“设置”按钮的消息响应函数中添加设置JOG速度的代码:
//根据所选择轴的不同,设置JOG运动速度
switch(m_chooseAxis)
case0:
{
m_Cntl->
SetParmFloat(12348,m_jogVel,true);
//调用Control类的SetParaFloat函数对ACR控制器的浮点型P参//数赋值
break;
}
case1:
SetParmFloat(12604,m_jogVel,true);
case2:
SetParmFloat(12860,m_jogVel,true);
case3:
m_Cntl->
SetParmFloat(13116,m_jogVel,true);
default:
break;
我们先选择要设置JOG速度的轴,再在文本框中输入该轴JOG运动速度,最后单击“设置”按钮让该设置生效。
如图4-6示,将轴0的JOG速度设置为2.6。
图4-6
在“JOG+”按钮的响应函数中添加下面代码:
//根据所选择轴的不同,控制各轴的JOG正向运动
case0:
SetFlag(797,false,true);
//调用Control类的SetFlag函数对某一个BIT位置位或复位
SetFlag(796,true,true);
SetFlag(829,false,true);
SetFlag(828,true,true);
SetFlag(861,false,true);
SetFlag(860,true,true);
SetFlag(893,false,true);
SetFlag(892,true,true);
在“JOG停”按钮消息相应函数中添加如下代码:
SetFlag(796,false,true);
SetFlag(828,false,true);
SetFlag(860,false,true);
SetFlag(892,false,true);
在“JOG-”按钮消息响应函数中添加如下代码:
SetFlag(797,true,true);
SetFlag(829,true,true);
SetFlag(861,true,true);
SetFlag(893,true,true);
当选好JOG运动的轴,并设置好该轴JOG运动速度后,就可以控制该轴的JOG运动。
下面我们增加一个功能块,来读取各轴的当前位置(SecondarySetpoint)、实际位置及跟随误差值。
做完的效果图如图4-7示:
图4-7
界面的重点是增加12个文本框控件,每个文本框控件都关联一个成员变量。
对应关系见下表:
对应的控制器P参数
轴0当前位置
IDC_ED_AXIS0SECPOS
M_axis0SecPos
P12295
轴1当前位置
IDC_ED_AXIS1SECPOS
M_axis1SecPos
P12551
轴2当前位置
IDC_ED_AXIS2SECPOS
M_axis2SecPos
P12807
轴3当前位置
IDC_ED_AXIS3SECPOS
M_axis3SecPos
P13063
轴0实际位置
IDC_ED_AXIS0ACRPOS
M_axis0AcrPos
P12290
轴1实际位置
IDC_ED_AXIS1ACRPOS
M_axis1AcrPos
P12546
轴2实际位置
IDC_ED_AXIS2ACRPOS
M_axis2AcrPos
P12802
轴3实际位置
IDC_ED_AXIS3ACRPOS
M_axis3AcrPos
P13058
轴0跟随误差
IDC_ED_AXIS0FOLERR
M_axis0FowErr
P12291
轴1跟随误差
IDC_ED_AXIS1FOLERR
M_axis1FowErr
P12547
轴2跟随误差
IDC_ED_AXIS2FOLERR
M_axis2FowErr
P12803
轴3跟随误差
IDC_ED_AXIS3FOLERR
M_axis3FowErr
P13059
关联变量均为long型
有两种方法可以读取控制器中数据。
1、使用查询的方法读取数据。
参考Status类中的GetACRCustom函数。
2、使用消息的方法读取数据。
参考Status类中的AddACRCustom及GetStatus函数。
我们这里采用第一种方法,在连接成功后读取一次数据;
采用第二种方法,实时读取数据。
我们在CACR9000Dlg类中增加一个局部变量m_pstr
我们需要将要读取的P参数组合成一个字符串。
我们在“连接”按钮的响应函数中添加下面代码(粉字部分):
if(!
GetIsOffline())//判断控制器是否离线(连接成功)
//如果连接成功,则对话框上显示
//“控制器连接成功”及版本号
m_pstr="
P12295,P12551,P12807,P13063,P12290,P12546,P12802,P13058,P12291,P12547,P12803,P13059"
然后调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACR 控制器 上位 程序 开发 MFC