<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al

         

         

        VFP 環 境 下 實 時 數 據 采 集 的 實 現

        東 南 大 學 熱 能 所(210096)---- 周 衛 平


        ---- VFP 作 為 新 一 代 數 據 庫 管 理 系 統, 在 數 據 的 存 取、 編 輯、 顯 示、 處 理 等 方 面 具 有 強 大 和 豐 富 的 工 具, 在 國 內 外 得 到 了 廣 泛 應 用。 在 許 多 工 業 應 用 中, 往 往 要 對 現 場 模 擬 數 據 進 行A/D 轉 換 且 實 時 處 理, 由 于VFP 不 能 對 端 口 進 行 直 接 訪 問, 因 而 無 法 實 現 數 據 采 集。 幸 好VFP 提 供 了DDE 功 能。DDE 是Windows 應 用 程 序 之 間 進 行 動 態 信 息 傳 遞 和 共 享 的 一 個 消 息 協 議, 利 用DDE 可 實 現Windows 的 服 務 程 序 和 客 戶 程 序 的 相 互 獨 立 運 行, 具 有 很 好 的 實 時 性。 在 實 踐 中, 我 們 利 用 高 級 語 言BorLand C++ for Windows 實 現96 路A/D 數 據 采 集, 并 以 此 為 服 務 程 序; 在VFP 環 境 下 建 立 客 戶 程 序, 將 服 務 程 序 傳 遞 過 來 的 數 據 及 時 進 行 運 算 處 理 后, 存 入 數 據 庫, 并 作 為 各 種 表 單、 報 表、 曲 線 的 數 據 源。 該 方 法 在VB 或ACCESS 97 環 境 下 同 樣 適 用, 只 要 將 客 戶 程 序 稍 加 修 改 即 可。 下 面 就 如 何 實 現VFP 環 境 下 的 實 時 數 據 采 集 作 一 介 紹。

        1. 建 立 數 據 采 集 服 務 程 序

        ---- 服 務 程 序 包 括 二 個 基 本 部 分: 其 一 是WinMain 入 口 函 數, 它 主 要 完 成 一 此 初 始 化 任 務, 建 立 一 個 名 為hwnd 的 原 始 數 據 顯 示 窗 口, 服 務 程 序 名 為PFBCdas。 其 二 是 應 用 程 序 功 能 函 數MainWndProc。 下 面 是 程 序 清 單( 因 篇 幅 關 系, 在 此 省 去WinMain 函 數)。
        #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數據存儲單元 
        int     DdeAdviseStatus=0;
        char    buf[64], DDEbuf[2048];       //數據暫存緩沖器 
        char    szAppName[]="PFBCdas";    //服務程序名
        char    szDdeTopic[]="AD001";     //主題名 
        char    szDdeItem[]="DATA";      // 數據項名
        long FAR PASCAL _export MainWndProc(HWND, UINT, UINT, LONG) ;
        long FAR PASCAL _export MainWndProc (HWND hwnd, UINT message, UINT 
                                          wParam, LONG lParam)    
        //應用程序功能函數   
             {
             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); 
                                 //打開定時器
                outportb(base+11,0x10);  //選擇軟件觸發方式
                outportb(base+9,1);      //選擇輸入信號放大倍數為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++)       //采樣點為6*16=96個
                  {
                   outportb(base+13,j);                  
                   outportb(base+10,i);   
                   outportb(base+12,0);     //啟動A/D轉換
                   do AD_Status=inportb(base+5);
                   while ((AD_Status&0x10)==0x10); 
        //判轉換是否結束?                                                                 
        AD_Data[i][j]=(inportb(base+5)&0x0f)*256+inportb(base+4); 
                        /*  讀A/D轉換后的數字值  */
                    }
                   _strdate(buf);                 //取采樣日期
                   strcpy(DDEbuf,buf);
                   strcat(DDEbuf,",");
                   _strtime(buf);                //取采樣時間
                   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),",");
                      /*各采樣數據之間以逗號分隔*/
                     strcat(DDEbuf,buf);
                     }
                   if(DdeAdviseStatus!=0)      //如果建立了DDE服務
                   {
                   aItem = GlobalAddAtom (szDdeItem) ;
                               //添加DDE數據項為全局原子
                   hDdeData = GlobalAlloc (GHND | GMEM_DDESHARE,
                                 sizeof (DDEDATA) + strlen (DDEbuf)) ;
                       /*給采樣數據分配全局內存塊*/
                   lpDdeData = (DDEDATA FAR *) GlobalLock (hDdeData) ;
                   lpDdeData->fResponse = 0 ;
                   lpDdeData->fRelease  = 1 ;
                   lpDdeData->fAckReq   = 0 ;
                   lpDdeData->cfFormat  = CF_TEXT ;
                                  //采樣數據為文本格式
                   lstrcpy ((LPSTR) lpDdeData->Value,DDEbuf) ;
                       /*將采樣數據從緩沖器放至DDE內存*/
                   GlobalUnlock (hDdeData) ;
                   if(!PostMessage(hwndClient,WM_DDE_DATA,hwnd,
                      MAKELONG(hDdeData,aItem)))  //發送DDE數據
                   {
                    GlobalFree(hDdeData); 
                          //若發送失敗,則釋放資源
                    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))
                  {           // 發送服務程序名和主題名
                SendMessage(hwndClient,WM_DDE_ACK,hwnd,
                               MAKELONG(aAppName,aTopic));
                       } 
                  else
                  {
                   GlobalDeleteAtom (aAppName) ;
                   GlobalDeleteAtom (aTopic) ;
                      }
                   return 0 ;
           case WM_DDE_TERMINATE:     //關閉DDE服務
                hwndClient=wParam;      
                PostMessage (hwndClient, WM_DDE_TERMINATE, hwnd, 0L) ;
                return 0 ;
           case WM_DDE_ADVISE:        //建立DDE服務
                DdeAdviseStatus=1;           //已建立DDE服務標志
                hwndClient=wParam;
                aItem=HIWORD(lParam);
                if(!PostMessage(hwndClient,  WM_DDE_ACK,  hwnd,
                  MAKELONG(0x8000,aItem)))          //發送DDE應答
                {
                 GlobalDeleteAtom(aItem);
                        }
                 return 0;
           case WM_DESTROY:             //程序失敗處理
                PostQuitMessage (0) ;
                return 0 ;
                   }
             return DefWindowProc (hwnd, message, wParam, lParam) ;
             }
        

        2. 建 立VFP 環 境 下 的 客 戶 端 程 序

        ---- 首 先 建 立 和 服 務 程 序 之 間 的 通 道, 然 后 將 服 務 程 序 傳 遞 來 的 數 據 放 至 字 符 串DATA 內, 再 通 過 自 定 義 函 數recdata 將 采 樣 數 據 存 入 數 據 庫 中 待 用。 下 面 是 客 戶 程 序 清 單。
        PROCEDURE   getdata
        PUBLIC  mchannel
        mchannel = DDEInitiate('PFBCdas','AD001') 
        &&建立客戶程序和服務程序間的通道 
        IF   mchannel !=-1
          =DDEadvise(mchannel,'DATA','recdata',2)
                        &&建立DDE熱連接,數據項為DATA
        ENDIF
        RETURN
        
        PROCEDURE  recdata      &&用戶自定義函數
        PARAMETERS  channel,action,item,data,format,status
        PRIVATE   newdata
        newdata=""
        IF  action='ADVISE'        &&若連接成功
           newdata=DATA            &&將采樣數據傳遞至newdata
           do process with newdata      &&調用數據處理程序 
        ELSE
           IF  action='TERMINATE'                       
                = DDETerminate(mchannel)   &&關閉通道
           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)         &&取時間值
        * 從字符串newdata的相鄰逗號間取采樣值,
                            并將采樣值轉化為毫伏值
        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
                            &&打開數據庫onedata
        ENDIF
        APPEND  FROM  ARRAY  gdata
                       &&將數組gdata中的轉換數據添加到數據庫中 
        RETURN  
        
        ---- 聯 系 地 址: 南 京 市 東 南 大 學 熱 能 工 程 研 究 所
        ---- 郵 編:210096
        ---- 聯 系 人: 周 衛 平
        ---- 電 話:(025)3794191
        ---- EMAIL 地 址:qhye@seu.edu.cn 主站蜘蛛池模板: 99久久精品免费看国产| 国产欧美另类精品久久久| 欧美成人精品三级网站视频| 最新中文字幕av无码专区不| 99国产精品白浆在线观看免费| 国产精品亚洲av三区色| 一区二区精品久久蜜精品| 色爱综合激情五月激情| 加勒比无码av中文字幕| 国产日产免费高清欧美一区| 亚洲天堂免费av在线观看| 亚洲综合网站久久久| 内射中出无码护士在线| 国产午夜精品福利视频| 国产精品啪| 2021av在线天堂网| 国产精品理论片| 狠狠色狠狠综合久久| 黄色一级片一区二区三区| 东京热人妻无码一区二区av| 爱啪啪av导航| 亚洲黄色性视频| 综合亚洲网| 国产精品成人久久电影| 精品亚洲国产成人av| 无码一区二区三区免费| 一区二区福利在线视频| 国产精品色一区二区三区 | 日韩a∨精品日韩在线观看 | 日本道播放一区二区三区| 国产蜜臀av在线一区在线| 亚洲一区精品视频在线| 苍井空一区二区三区在线观看| 午夜福利92国语| 无码熟妇人妻av在线电影| 午夜色无码大片在线观看免费| 亚洲精品欧美综合二区| 午夜福利在线观看成人| 在线观看无码一区二区台湾 | 亚洲Av综合日韩精品久久久| 少妇办公室好紧好爽再浪一点|