COM組件技術(shù)在現(xiàn)場(chǎng)總線(xiàn)控制系統(tǒng)組態(tài)軟件中的應(yīng)用
HRESULT SendData[in]BYTE SendBuf[256]);
[id(3),helpstring(啟動(dòng)多線(xiàn)程)]
HRESULT SendFinish ([in]BOOL bFinish);
[id(4),helpstring(此函數(shù)返回值表示數(shù)據(jù)是否已向下位機(jī)發(fā)送完畢,同時(shí)可顯示哪些模塊未被配置,通常在此函數(shù)前先用FinishQuery([out]BOOL*bFinish)查詢(xún)發(fā)送是否完畢)]
HRESULT ReceiveResult([out]BOOL *bSendFinish);
[id(5)],helpstring(此函數(shù)返回值表示數(shù)據(jù)是否已向下位機(jī)發(fā)送完畢,“真”表示發(fā)送完畢)]
HRESULT FinishQuery([out]BOOL *bFinish);
[id(6),helpstring(網(wǎng)絡(luò)檢查,用來(lái)在發(fā)送數(shù)據(jù)前檢測(cè)是否有該節(jié)點(diǎn)存在)]
HRESULT NetCheck[in]BYTE sour,[in]BYTE des,[in]BYTE type,[out]BOOL *flag);
[id(7),helpstring(讀取模塊的測(cè)量值)]
HRESULT GetPV([iv]BYTE bDesNode,[out]float value[256]);
}
適配器初始化函數(shù):
#include conio.h>
#include winioctl.h
//包含其它頭文件
……
STDMETHODIMP CNCardWork::NcardInit(BYTE bSrcNode,BYTE bIntrAdd,BYTE bRate,long bSegmentAdd,BOOL *flag)
{
NcardCtrl cardctrl; //NcardCtrl類(lèi)的函數(shù)調(diào)用VxD函數(shù)
exbSrcNode=bSrcNode; //給上位機(jī)節(jié)點(diǎn)賦值
exbRate=bRate; //下位機(jī)與適配器的通信波特率
BOOL transfersign; //初始化是否成功標(biāo)志
DWORD dwSegmentaddress=bSegmentAdd;//適配器段地址
HANDLE hDevice=NULL; //指向線(xiàn)性指針對(duì)句柄
LpBaseAddress=(PBYTE)cardctrl.MapLinearAddress(dwSegmentaddress,0x400,hDevice);
//調(diào)用VxD函數(shù),獲得指向ISA總線(xiàn)物理地址的線(xiàn)性地址指針
cardctrl,UnMapLinearAddress(lpBaseAddress,hDevice);
//關(guān)閉VxD
//調(diào)用適配器初始化函數(shù)
_outp(0x310,0x01); //打開(kāi)郵箱鎖
lpBaseAddress[0x3F0]=bSrcNodeNumber;//上位機(jī)節(jié)點(diǎn)號(hào)
lpBaseAddress[0x3F1]=bRate; //波特率
lpBaseAddress[0x3F8]=0xC6; //適配器初始化命令字
DrvDelay(20,false); //延時(shí)20ms
………… //初始化后其它操作
_outp(0x310,00); //關(guān)閉郵箱鎖
return S_OK;
}
4 虛擬設(shè)備驅(qū)動(dòng)程序
VxD是虛擬設(shè)備驅(qū)動(dòng)程序(Virtual Device Driver)的縮寫(xiě),中間的x表示某一設(shè)備。它能夠無(wú)限制地訪(fǎng)問(wèn)所有硬件設(shè)備、自由地檢測(cè)操作系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如描述符和頁(yè)表)以及訪(fǎng)問(wèn)任何內(nèi)存位置。
本文中,VxD將ISA總線(xiàn)對(duì)應(yīng)的物理地址轉(zhuǎn)換成段線(xiàn)性地址,供應(yīng)用程序使用。VxD的開(kāi)發(fā)工具是VtoolsD,轉(zhuǎn)換時(shí)用的函數(shù)為MapPhysToLinear。以下是部分程序代碼:
//定義結(jié)構(gòu)體
typedef struct _MapDevRequest
{
PVOID mdr_PhysicalAddress;DWORD mdr_SizeInBytes;
PVOID mdr_LinearAddress;WORD mdr_Status;
}MAPDEVREQUEST,*PMAPDEVREQUEST;
#includevtoolscp.h>
評(píng)論