#define AD_Interval 1000 //采樣周期為 1000ms #define base 0x280 // A/D采樣板基地址 /* base+k (k=1,2,…14)為A/D板各寄存器地址 */ #include#include #include #include #include #include #include #include #include int i, j, k , AD_Status, idTimer; int AD_Data[8][16]; // A/D數(shù)據(jù)存儲(chǔ)單元 int DdeAdviseStatus=0; char buf[64], DDEbuf[2048]; //數(shù)據(jù)暫存緩沖器 char szAppName[]="PFBCdas"; //服務(wù)程序名 char szDdeTopic[]="AD001"; //主題名 char szDdeItem[]="DATA"; // 數(shù)據(jù)項(xiàng)名 long FAR PASCAL _export MainWndProc(HWND, UINT, UINT, LONG) ; long FAR PASCAL _export MainWndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) //應(yīng)用程序功能函數(shù) { ATOM aAppName,aTopic; ATOM aItem; GLOBALHANDLE hDdeData; DDEDATA FAR *lpDdeData; static HWND hwndClient; switch (message) { case WM_CREATE: idTimer=SetTimer(hwnd,NULL,AD_Interval,NULL); //打開定時(shí)器 outportb(base+11,0x10); //選擇軟件觸發(fā)方式 outportb(base+9,1); //選擇輸入信號(hào)放大倍數(shù)為10 outportb(base+14,0); outportb(base+13,0); //清A/D完成位 outportb(base+10,0); //選擇通道0 return 0; case WM_TIMER: for(i=0;i<6;i++) for(j=0;j<16;j++) //采樣點(diǎn)為6*16=96個(gè) { outportb(base+13,j); outportb(base+10,i); outportb(base+12,0); //啟動(dòng)A/D轉(zhuǎn)換 do AD_Status=inportb(base+5); while ((AD_Status&0x10)==0x10); //判轉(zhuǎn)換是否結(jié)束? AD_Data[i][j]=(inportb(base+5)&0x0f)*256+inportb(base+4); /* 讀A/D轉(zhuǎn)換后的數(shù)字值 */ } _strdate(buf); //取采樣日期 strcpy(DDEbuf,buf); strcat(DDEbuf,","); _strtime(buf); //取采樣時(shí)間 strcat(DDEbuf,buf); strcat(DDEbuf,","); for(i=0;i<6;i++) for(j=0;j<16;j++) { char temp[32]; strcat(itoa(AD_Data[i][j],buf,10),","); /*各采樣數(shù)據(jù)之間以逗號(hào)分隔*/ strcat(DDEbuf,buf); } if(DdeAdviseStatus!=0) //如果建立了DDE服務(wù) { aItem = GlobalAddAtom (szDdeItem) ; //添加DDE數(shù)據(jù)項(xiàng)為全局原子 hDdeData = GlobalAlloc (GHND | GMEM_DDESHARE, sizeof (DDEDATA) + strlen (DDEbuf)) ; /*給采樣數(shù)據(jù)分配全局內(nèi)存塊*/ lpDdeData = (DDEDATA FAR *) GlobalLock (hDdeData) ; lpDdeData->fResponse = 0 ; lpDdeData->fRelease = 1 ; lpDdeData->fAckReq = 0 ; lpDdeData->cfFormat = CF_TEXT ; //采樣數(shù)據(jù)為文本格式 lstrcpy ((LPSTR) lpDdeData->Value,DDEbuf) ; /*將采樣數(shù)據(jù)從緩沖器放至DDE內(nèi)存*/ GlobalUnlock (hDdeData) ; if(!PostMessage(hwndClient,WM_DDE_DATA,hwnd, MAKELONG(hDdeData,aItem))) //發(fā)送DDE數(shù)據(jù) { GlobalFree(hDdeData); //若發(fā)送失敗,則釋放資源 GlobalDeleteAtom(aItem); } } return 0; case WM_DDE_INITIATE: //DDE初始化 hwndClient=wParam; hdc=GetDC(hwnd); aAppName=GlobalAddAtom(szAppName); aTopic=GlobalAddAtom(szDdeTopic); if ((LOWORD (lParam) == NULL || LOWORD (lParam) == aAppName) && (HIWORD (lParam) == NULL || HIWORD (lParam) == aTopic)) { // 發(fā)送服務(wù)程序名和主題名 SendMessage(hwndClient,WM_DDE_ACK,hwnd, MAKELONG(aAppName,aTopic)); } else { GlobalDeleteAtom (aAppName) ; GlobalDeleteAtom (aTopic) ; } return 0 ; case WM_DDE_TERMINATE: //關(guān)閉DDE服務(wù) hwndClient=wParam; PostMessage (hwndClient, WM_DDE_TERMINATE, hwnd, 0L) ; return 0 ; case WM_DDE_ADVISE: //建立DDE服務(wù) DdeAdviseStatus=1; //已建立DDE服務(wù)標(biāo)志 hwndClient=wParam; aItem=HIWORD(lParam); if(!PostMessage(hwndClient, WM_DDE_ACK, hwnd, MAKELONG(0x8000,aItem))) //發(fā)送DDE應(yīng)答 { GlobalDeleteAtom(aItem); } return 0; case WM_DESTROY: //程序失敗處理 PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
PROCEDURE getdata PUBLIC mchannel mchannel = DDEInitiate('PFBCdas','AD001') &&建立客戶程序和服務(wù)程序間的通道 IF mchannel !=-1 =DDEadvise(mchannel,'DATA','recdata',2) &&建立DDE熱連接,數(shù)據(jù)項(xiàng)為DATA ENDIF RETURN PROCEDURE recdata &&用戶自定義函數(shù) PARAMETERS channel,action,item,data,format,status PRIVATE newdata newdata="" IF action='ADVISE' &&若連接成功 newdata=DATA &&將采樣數(shù)據(jù)傳遞至newdata do process with newdata &&調(diào)用數(shù)據(jù)處理程序 ELSE IF action='TERMINATE' = DDETerminate(mchannel) &&關(guān)閉通道 ENDIF ENDIF RETURN PROCEDURE process PARAMETER newdata PRIVATE i,loc1,loc2 DIMENSION gdata(98) * 從字符串 newdata中取采樣值 gdata(97)=CTOD(left(newdata,8)) &&取日期值 gdata(98)=SUBSTR(newdata,10,8) &&取時(shí)間值 * 從字符串newdata的相鄰逗號(hào)間取采樣值, 并將采樣值轉(zhuǎn)化為毫伏值 FOR i=3 TO 98 loc1=ATC(",", newdata, (i-1)) loc2=ATC(",", newdata, (i)) gdata(i-2)=VAL(SUBSTR(newdata,(loc1+1),(loc2-loc1))) *0.024414062 ENDFOR IF USED("onedata") SELECT onedata ELSE SELECT 0 USE onedata ALIAS onedata &&打開數(shù)據(jù)庫(kù)onedata ENDIF APPEND FROM ARRAY gdata &&將數(shù)組gdata中的轉(zhuǎn)換數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中 RETURN---- 聯(lián) 系 地 址: 南 京 市 東 南 大 學(xué) 熱 能 工 程 研 究 所