<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕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 主站蜘蛛池模板: 色综合久久综合久鬼色88| 中文字幕日韩一区二区不卡| 国产日韩av免费无码一区二区三区| 国产精品日韩av在线播放 | 久久精品国产亚洲av热一区| 黑人异族巨大巨大巨粗| 国产熟女高潮一区二区三区| 国产精品自偷一区在线观看| jizz视频在线观看| 国产普通话刺激视频在线播放| 日韩一区二区三区女优丝袜| 亚洲区一区二区激情文学| 十八禁国产精品一区二区| 5D肉蒲团之性战奶水欧美| 久久毛片少妇高潮| 天天躁日日躁狠狠躁中文字幕| 美腿丝袜亚洲综合第一页| 精品乱码一区二区三四五区| 乱码视频午夜在线观看| 亚洲国产中文字幕在线视频综合 | 国产国产成人精品久久蜜| 国产成人高清亚洲综合| 最新AV中文字幕无码专区| 国产成人亚洲日韩欧美| 18禁亚洲一区二区三区| 亚洲a∨国产av综合av| 日韩毛片在线视频x| 国模在线视频一区二区三区 | 免费人成视频网站在线18| 人妻无码∧V一区二区| 成人午夜福利一区二区四区| 免费又大粗又爽又黄少妇毛片| 四虎亚洲国产成人久久精品| 亚洲美女av一区二区| 人人妻人人狠人人爽天天综合网| 久久月本道色综合久久| 无套内谢少妇毛片aaaa片免费| 亚洲国产一区二区三区久| 亚洲国产精品自产在线播放| 亚洲成av人最新无码不卡短片| 欧美人成精品网站播放|