9.PMAC上位机-上位机发送指令
通常我们说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();
- }
程序演示代码下载链接