通常我们说PC控制其他硬件工作,指的是PC给相应的硬件发送指令来控制对应硬件。同时在发送完指令后可能会接受到相对应的反馈消息,告诉PC当前硬件的状态和参数等数据,这就是常见的PC和硬件通信。PMAC已经帮我们封装好了这通信过程,直接调用相关函数即可,这里讲通过上位机给PMAC发送指令控制电机运动或设置参数或返回当前指定参数值等。
PMAC提供PmacGetResponse和PmacGetResponseEX给PMAC发送指令。这一过程非常类似在Terminal中我们手动给PMAC发送指令,这里两个函数支持发送的命令也是在Terminal中输入的在线指令(Online Command)。
先看几个最简单示例额,在对话框上分别添加几个按钮和其响应函数,在响应函数中添加代码实现如下功能:
//链接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();
//链接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();
//链接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();
//链接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就足以满足我们的需求了。
总体演示,下面我们把上面的常用功能集成到如下界面中:
对应的操作代码和上述演示代码一样,这里为了演示方便每次发送指令前都要建立环境和连接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