使用MFC写一个GTS点位运动的Demo

       点位运动几乎是每台设备必须具备的运动模式,这个教程是基于MFC写一个固高GTS的点位运动Demo,话不多说,直接上流程。

1.创建项目

1.1 打开VS2022,创建一个新项目。

创建项目

1.2编程语言选择C++,平台为Windows,选择MFC应用。

选择环境

1.3给项目起一个名字。

项目命名

1.4 应用类型选择基于对话框,然后点击右下方的“完成”按钮。

选择对话框类型

2.引用库文件

2.1 项目创建出来后先运行一下,在根目录下生成debug文件夹。

编译生成debug文件夹

2.2 把库文件拷贝到程序目录和debug文件夹,这里使用64位的多卡库。

放置动态库2

放置动态库

2.3 在程序中引用库文件。

在对话框页面代码中包含有文件并引用静态库。

// GTSTrapDlg.cpp: 实现文件

#include "pch.h"
#include "framework.h"
#include "GTSTrap.h"
#include "GTSTrapDlg.h"
#include "afxdialogex.h"
#include  "gts.h"        //包含头文件

#pragma comment (lib, "gts.lib")  //调用静态库

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

3.界面控件布局

3.1 从工具箱中把需要的控件拖出来放到界面上

布置控件

3.2 给控件命名

       每个控件的描述文字可以在拖到窗口的时候,直接打字命名,也可以鼠标选中控件,右键选择属性,在右侧的属性窗口中,找到“描述文字”然后写上描述文字,例如初始化按钮:

设置按钮属性

3.3 设置卡号选择下拉控件属性

设置下拉选择框属性

3.4 给卡号选择下拉控件添加一个变量,(轴号选择下拉框添加变量同理)

下拉选择框设置变量

下拉选择框设置变量2

3.5 生成卡号下拉选择控件索引改变事件(生成轴号选择下拉框切换索引的响应事件同理

下拉选择框添加事件

3.6 写卡号下拉选择控件索引改变事件内容(轴号选择的响应事件同理)

首先定义两个变量来存放卡号喝轴号:

#include "pch.h"
#include "framework.h"
#include "GTSTrap.h"
#include "GTSTrapDlg.h"
#include "afxdialogex.h"
#include  "gts.h"        //包含头文件

#pragma comment (lib, "gts.lib")  //调用静态库

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

short cardNum = 0;//卡号,全局变量,所有函数均可使用,赋值为0,默认选用第一张卡
short axisNum = 1;//轴号,全局变量,所有函数均可使用,赋值为1,默认选用第一轴

卡号和轴号切换实现:

void CGTSTrapDlg::OnCbnSelchangeCombo1()
{
	// TODO: 在此添加控件通知处理程序代码
	cardNum = m_cardNum.GetCurSel(); //号选择下拉框索引从0开始,当卡号选择下拉框索引改变时,卡号等于索引号(多卡库卡号也是从0开始)
}

void CGTSTrapDlg::OnCbnSelchangeCombo2()
{
	// TODO: 在此添加控件通知处理程序代码
	cardNum=m_axisNum.GetCurSel()+1;//轴选择下拉框索引从0开始,当轴号选择下拉框索引改变时,轴号等于索引号+1(因为轴号从1开始)
}

设置=初始化时的卡号和轴号的默认选项:

// CGTSTrapDlg 消息处理程序

BOOL CGTSTrapDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_cardNum.SetCurSel(0);//设置索引为0,卡号选择下拉框默认选择卡1
	m_axisNum.SetCurSel(0);//设置索引为0,轴号选择下拉框默认选择轴1

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

3.7 给点位参数设置用的Edit ConTrol绑定变量

编辑框添加变量

        选中目标位置的参数设置控件,右键选择添加变量,在弹出的窗口中绑定变量,类别选择值(用于设置参数值的一定要值),变量类型写long,其他的速度、加速度、减速度、起跳速度类型是double,平滑时间的值类型是short,变量绑定完成后可以给变量赋初值。

// CGTSTrapDlg 对话框
CGTSTrapDlg::CGTSTrapDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_GTSTRAP_DIALOG, pParent)
	, m_trapPos(10000)  //控件变量赋初值
	, m_trapVel(20)
	, m_trapAcc(0.5)
	, m_trapDec(0.5)
	, m_startVel(0)
	, m_smooth(10)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

3.8 修改状态显示控件的ID

修改状态显示控件ID

3.9 修改指令返回值用的Edit Control 的属性,并绑定变量

修改log显示控件属性

修改log显示控件属性2

3.9 定义打印函数返回值的函数

// GTSTrapDlg.cpp: 实现文件

......
void CGTSTrapDlg::commandhandler(char* command, short error)  //把函数定在在CGTSTrapDlg::作用域内,方便CGTSTrapDlg类调用
{
	
	CString str;
	if (error)
	{
		str.Format(L"%s = %d\r\n", (CString)command, error);//格式化字符串
		m_info.ReplaceSel(str);                 //自动换行显示

	}
}

4. 写按钮点击函数

双击按钮即可生成点击函数,在生成的函数里写内容。

// GTSTrapDlg.cpp: 实现文件
......
// 初始化按钮
void CGTSTrapDlg::OnBnClickedButton1()
{
	
	short sRtn;
	sRtn = GT_Open(cardNum);    //打开运动控制器
	commandhandler("GT_Open", sRtn);
	sRtn = GT_Reset(cardNum);                     //复位运动控制器
	commandhandler("GT_Reset", sRtn);
	sRtn = GT_LoadConfig(cardNum, "GTS800.cfg");   //下载运动控制器配置文件
	commandhandler("GT_LoadConfig", sRtn);
	sRtn = GT_ClrSts(cardNum, 1, 8);                //清除所有轴状态
	commandhandler("GT_ClrSts", sRtn);

	SetTimer(1,10,NULL); //启动定时器
	
}

//伺服使能按钮
void CGTSTrapDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	short sRtn;
	sRtn = GT_AxisOn(cardNum, axisNum);  //伺服使能
	commandhandler("GT_AxisOn", sRtn);
}

//位置清零按钮
void CGTSTrapDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	short sRtn;
	sRtn = GT_ZeroPos(cardNum, axisNum);  //位置清零
	commandhandler("GT_ZeroPos", sRtn);
}

//启动运动按钮
void CGTSTrapDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	short sRtn;
	UpdateData(TRUE);//将各控件中的值保存至相应变量
	
	TTrapPrm trap1;       //定义一个存储运动参数的结构体
	sRtn = GT_PrfTrap(cardNum, axisNum);//将轴设置为Trap模式
	sRtn = GT_GetTrapPrm(cardNum, axisNum, &trap1); //读取点为运动参数
	trap1.acc = m_trapAcc;                //加速度
	trap1.dec = m_trapDec;                //减速度
	trap1.smoothTime = m_smooth;           //平滑减速时间
	trap1.velStart = m_startVel;           //平滑减速时间
	sRtn = GT_SetTrapPrm(cardNum, axisNum, &trap1);//设置Trap参数
	sRtn = GT_SetPos(cardNum, axisNum, m_trapPos);//设置轴的目标位置
	sRtn = GT_SetVel(cardNum, axisNum, m_trapVel);//设置轴的目标速度
	sRtn = GT_Update(cardNum, 1<<(axisNum-1));      //启动轴的运动
}

//停止运动按钮
void CGTSTrapDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	short sRtn;
	sRtn = GT_Stop(cardNum, 1<<(axisNum-1),0);  //平滑停止轴
	commandhandler("GT_Stop", sRtn);
}

5. 给窗口添加定时器用于刷新状态

添加定时器

在定时器里面写入相关代码

// GTSTrapDlg.cpp: 实现文件

double prfpos;
long sts;
double encpos;
CString strTemp;
void CGTSTrapDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	GT_GetPrfPos(cardNum, axisNum, &prfpos, 1, NULL);//读取轴的规划位置
	strTemp.Format(_T("%.3f"), prfpos);//格式化字符串
	SetDlgItemText(IDC_PRFPOS, strTemp);
	GT_GetEncPos(cardNum, axisNum, &encpos, 1, NULL);//读取轴的编码器位置
	strTemp.Format(_T("%.3f"), encpos);//格式化字符串
	SetDlgItemText(IDC_ENCPOS, strTemp);
	GT_GetSts(cardNum, axisNum, &sts, 1, NULL);//读取轴的状态
	
	if (sts&0x400)
	{
		strTemp = _T("运动中");
	}
	else
	{
		strTemp = _T("停止");
	}
	SetDlgItemText(IDC_STS, strTemp);

	CDialogEx::OnTimer(nIDEvent);
}

讲解到此结束,赶紧动手试试吧!

我也是有底线哒~
使用MFC写一个GTS点位运动的Demo-工控吧!
使用MFC写一个GTS点位运动的Demo
此内容为付费资源,请付费后查看
2.99
付费资源
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容