通常我们说PC控制其他硬件工作,指的是PC给相应的硬件发送指令来控制对应硬件。同时在发送完指令后可能会接受到相对应的反馈消息,告诉PC当前硬件的状态和参数等数据,这就是常见的PC和硬件通信。PMAC已经帮我们封装好了这通信过程,直接调用相关函数即可,这里讲通过上位机给PMAC发送指令控制电机运动或设置参数或返回当前指定参数值等。
PMAC提供PmacGetResponse和PmacGetResponseEX给PMAC发送指令。这一过程非常类似在Terminal中我们手动给PMAC发送指令,这里两个函数支持发送的命令也是在Terminal中输入的在线指令(Online Command)。
先看几个最简单示例额,在对话框上分别添加几个按钮和其响应函数,在响应函数中添加代码实现如下功能:
1.设置参数
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
/*****************************************************/
lstrcpy(szCmd, "p1=1");
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
2.获取参数值
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
/*****************************************************/
lstrcpy(szCmd, "p1");
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/
//显示当前参数值
AfxMessageBox(szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
3.控制电机点动
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
/*****************************************************/
lstrcpy(szCmd, "#6j+");
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
4.控制程序运行
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
/*****************************************************/
lstrcpy(szCmd, "&1b20r");
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
注意这里的轴号和程序号和自己编写并下载的程序一致。
看到了吗,在/**/注释间的是不是很熟悉,其实就是我们在PEWin32中Terminal窗口发送的指令,在/**/之前和之后其实就是建立和释放操作环境的过程。很多时候,对于上位机程序来说,我们甚至只需要调用PmacGetResponse和PmacGetResponseEX就足以满足我们的需求了。
5.演示程序
总体演示,下面我们把上面的常用功能集成到如下界面中:
对应的操作代码和上述演示代码一样,这里为了演示方便每次发送指令前都要建立环境和连接PMAC、发送指令、断开连接和释放环境,在实际项目中,只需要再程序实例化或窗口实例化时建立环境和连接PMAC,在窗口关闭或程序退出时断开连接和释放环境即可。代码如下:
//发送指令
void CTest1Dlg::OnSend()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
//获得输入的待发送指令字符串
GetDlgItemText(IDE_COMMAND, szCmd, MAX_PATH);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//正方向移动
void CTest1Dlg::OnMovePos()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
lstrcpy(szCmd, "#6j+");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//负方向移动
void CTest1Dlg::OnMoveNeg()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
lstrcpy(szCmd, "#6j-");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//停止
void CTest1Dlg::OnStopMove()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
lstrcpy(szCmd, "#6k");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//回零
void CTest1Dlg::OnHome()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
/************************************************************************/
/*激活电机 */
/************************************************************************/
lstrcpy(szCmd, "#6j/#8j/");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
Sleep(1000);
/************************************************************************/
/* 调用回零程序,注意这里自己的回零程序号 */
/************************************************************************/
lstrcpy(szCmd, "&1b20r");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//运行程序
void CTest1Dlg::OnRunProg()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
lstrcpy(szCmd, "&1b40r");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
//停止程序
void CTest1Dlg::OnStopProg()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();
//打开PMAC卡连接
OpenPmacDevice(0);
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
lstrcpy(szCmd, "&1b40a");
//显示输入的待发送指令字符串
SetDlgItemText(IDE_COMMAND, szCmd);
//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
//显示接受指令
SetDlgItemText(IDE_RECEIVE, szRes);
//关闭PMAC卡连接
ClosePmacDevice(0);
//FreeLibrary
CloseRuntimeLink();
}
程序演示代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219