Turbo PMAC——上位机与下位机编程_通讯

PC端与PMAC卡的通讯,包括:PC给PMAC卡发送信号(完成参数设置、运动程序等)、以及处理PMAC的中断响应。

前提:上位机PC的编程是在VC6.0环境下完成的。

1.针对编程环境的说明

上位机需要安装PComm32(针对不同系列的PMAC卡,不一样,此时的硬件上Turbo Pmac PCI-1型卡),安装完成后会有Pcomm32.dll的动态链接库和Pcomm32.lib的导入库,还会有其他的接口驱动文件。

2.针对上位机编程

需要拷贝myRuntime.h和myRuntime.cpp以及Pcomm32.dll一同拷贝进当前目录下,并添加前两个文件。

#include "myRuntime.h"

//以下为一个添加的按钮响应
void CPmacConnectDlg::OnConnect() 
{
	//动态加载Pcomm32.dll函数
	if (NULL != OpenRuntimeLink())
	{
		AfxMessageBox(TEXT("加载Pcomm32.dll成功!"));
	}
	else
	{
		AfxMessageBox(TEXT("加载Pcomm32.dll失败!"));
		return;
	}
 
	//打开指定卡号PMAC,这里打开0号卡
	if (TRUE == OpenPmacDevice(0))
	{
		AfxMessageBox(TEXT("打开PMAC成功!"));
	}
	else
	{
		AfxMessageBox(TEXT("打开PMAC失败!"));
	}
 
	//关闭到PMAC连接
	ClosePmacDevice(0);
 
	//动态关闭Pcomm32.dll的使用
	CloseRuntimeLink();

这里myRuntime.h和myRuntime.cpp封装了动态加载PComm.dll的函数,其实就是LoadLibrary的调用。这里只封装了常用部分的,需要的自己可以仿照它的形式从Include/Runtime.h中找到对应函数的原型来添加封装。

这里只是为了测试连接功能,实际编写程序的时候,我们需要在InitInstance或InitDialog时初始化连接,在程序退出的时候关闭连接。简单来说就是最开始打开一次和最后关闭一次连接,不需要每次操作时都要频繁的打开和关闭。

3.详细

PC给PMAC发送指令控制它做什么,当运动程序完成后中断通知上位机,在中断的同时发送一个标识P100表明完成的程序号,这个标明到底是1号轴运动完,还是是2号轴运动完。在PC端有一个中断回调函数,下位机发送中断后,会自动跳转到该函数中,中断函数接受中断,根据标识P100来决定不同的情况不同的处理。

PC->PMAC:发送指令,告诉它做什么			(&1b40r)
PMAC:做完了,等待PC处理完前一个通知		(While (M613 = 1)  wait)
PMAC->PC:某某事做完了,PC你就看着处理吧		(P100=1 M613=1)
 
PC:针对PMAC通知的事判断属于什么类型并处理		(根据P100判断)
PC->PMAC:处理完了,下位机可以发下一个通知消息了	(P100=0 M613=0)

如上图所示,M613这个是用硬件跳线配置的,指定当前中断响应通道P100是我们指定的上下位机通信变量,这个是自己定义的,也可以是P1/P2/P3等。

下位机代码:

&1
CLOSE ;确认所有缓冲区被关闭
 
OPEN PROG 40
CLEAR
 
TA(200)
TS(20)
F(30)
INC
Linear
 
X(10) Y(40)
dwell 0
 
;中断发送程序段
While (M613 = 1)  wait                  ;等待上一次中断响应处理完成
P100=1					;标明当前完成的程序,可为0、1、2等自定义的值
M613=1					;向上位机发送中断
CLOSE

上位机处理代码:

注册中断处理函数:  

BOOL CInterruptDlg::ConnectPmac()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	if (NULL == PmacRuntimeLink(PMAC_NUM))
	{
		AfxMessageBox(TEXT("链接Pcomm32.dll函数库和打开PMAC卡连接失败!"));
		return m_bIsConnect = FALSE;
	}
	
	//中断函数绑定
	if(  FALSE == PmacINTRFuncCallInit(PMAC_NUM, InterruptFunc2, 0, 0xFF1F))
	{
		AfxMessageBox(TEXT("PMAC函数中断初始化失败"));
		return m_bIsConnect = FALSE;
	}
	
	return m_bIsConnect = TRUE;

对应的中断函数处理如下:

//中断处理
void WINAPI InterruptFunc2(DWORD msg, PINTRBUFFER pBuffer)
{
	extern CInterruptApp theApp;
	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];
	
	if (pBuffer->dwInterruptType == ISR_IR6)
	{
		if (1 == PmacGetVariable(PMAC_NUM, 'P', 100, 0))
		{
			AfxMessageBox(TEXT("处理完成!"));
			
			//重置中断
			lstrcpy(szCmd, "M613=0 P100=0");
			PmacGetResponse(0,szRes,MAX_PATH,szCmd);
		}
	}

参考http://blog.csdn.net/wenzhou1219

实际使用时,发现以上提到的.h和.cpp文件使用都有些问题。可能是因为平时到处下载的和找的文件比较多,发现pc里面好几个这样的文件,或有大小写差异。都是经过他人封装的文件。所以可以自己重新写。

猜你喜欢

转载自blog.csdn.net/sinat_26568145/article/details/80918020
今日推荐