1. 程式人生 > >Turbo PMAC——上位機與下位機程式設計_通訊

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裡面好幾個這樣的檔案,或有大小寫差異。都是經過他人封裝的檔案。所以可以自己重新寫。