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