午夜精品一区二区三区成人,中文字幕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
主站蜘蛛池模板:
国产精品国产三级国产av品爱网
|
欧美野外伦姧在线观看|
国产午夜精品福利免费看|
秋霞人妻无码中文字幕|
粉嫩蜜臀av一区二区三区|
野花韩国高清电影|
亚洲第一狼人区在线观看|
日韩黄色av一区二区三区|
亚洲人成人网站色www|
国产蜜臀av在线一区二区|
日本精品一区二区不卡|
中文无码日韩欧免费视频|
精品国产v一区二区三区|
精品乱码一区二区三四五区|
久久人妻无码一区二区三区av|
亚洲一区二区不卡av|
人人澡人摸人人添|
国产福利在线观看免费第一福利|
狠狠色狠狠色综合久久蜜芽|
美女把尿囗扒开让男人添|
国产一级三级三级在线视|
日韩福利视频导航|
亚洲高清WWW色好看美女|
四虎永久免费高清视频|
4399理论片午午伦夜理片|
蜜芽亚洲AV无码精品国产午夜|
久久天天躁狠狠躁夜夜躁|
欧美一区二区三区香蕉视|
精品视频福利|
国内揄拍国内精品人妻久久|
激情久久av一区二区三区
|
国产偷国产偷亚洲高清午夜|
人人人澡人人肉久久精品|
熟女性饥渴一区二区三区|
给我播放片在线观看|
久久人妻公开中文字幕|
欧美人禽zozo动人物杂交|
在线看高清中文字幕一区|
97欧美精品系列一区二区|
插入中文字幕在线一区二区三区|
国产二级一片内射视频播放|