点位运动几乎是每台设备必须具备的运动模式,这个教程是基于MFC写一个固高GTS的点位运动Demo,话不多说,直接上流程。
1.创建项目
1.1 打开VS2022,创建一个新项目。
1.2编程语言选择C++,平台为Windows,选择MFC应用。
1.3给项目起一个名字。
1.4 应用类型选择基于对话框,然后点击右下方的“完成”按钮。
2.引用库文件
2.1 项目创建出来后先运行一下,在根目录下生成debug文件夹。
2.2 把库文件拷贝到程序目录和debug文件夹,这里使用64位的多卡库。
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 给卡号选择下拉控件添加一个变量,(轴号选择下拉框添加变量同理)
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
3.9 修改指令返回值用的Edit Control 的属性,并绑定变量
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);
}
讲解到此结束,赶紧动手试试吧!

我也是有底线哒~
© 版权声明
THE END
暂无评论内容