首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
VFP环境下实时数据采集的实现
中华工控网
收藏本文     查看收藏
VFP 环 境 下 实 时 数 据 采 集 的 实 现 <BR> 东 南 大 学 热 能 所(210096)---- 周 卫 平 </P><P> --- VFP 作 为 新 一 代 数 据 库 管 理 系 统, 在 数 据 的 存 取、 编 辑、 显 示、 处 理 等 方 面 具 有 强 大 和 丰 富 的 工 具, 在 国 内 外 得 到 了 广 泛 应 用。 在 许 多 工 业 应 用 中, 往 往 要 对 现 场 模 拟 数 据 进 行A/D 转 换 且 实 时 处 理, 由 于VFP 不 能 对 端 口 进 行 直 接 访 问, 因 而 无 法 实 现 数 据 采 集。 幸 好VFP 提 供 了DDE 功 能。DDE 是Windows 应 用 程 序 之 间 进 行 动 态 信 息 传 递 和 共 享 的 一 个 消 息 协 议, 利 用DDE 可 实 现Windows 的 服 务 程 序 和 客 户 程 序 的 相 互 独 立 运 行, 具 有 很 好 的 实 时 性。 在 实 践 中, 我 们 利 用 高 级 语 言BorLand C++ for Windows 实 现96 路A/D 数 据 采 集, 并 以 此 为 服 务 程 序; 在VFP 环 境 下 建 立 客 户 程 序, 将 服 务 程 序 传 递 过 来 的 数 据 及 时 进 行 运 算 处 理 后, 存 入 数 据 库, 并 作 为 各 种 表 单、 报 表、 曲 线 的 数 据 源。 该 方 法 在VB 或ACCESS 97 环 境 下 同 样 适 用, 只 要 将 客 户 程 序 稍 加 修 改 即 可。 下 面 就 如 何 实 现VFP 环 境 下 的 实 时 数 据 采 集 作 一 介 绍。 <BR> 1. 建 立 数 据 采 集 服 务 程 序 <BR> ---- 服 务 程 序 包 括 二 个 基 本 部 分: 其 一 是WinMain 入 口 函 数, 它 主 要 完 成 一 此 初 始 化 任 务, 建 立 一 个 名 为hwnd 的 原 始 数 据 显 示 窗 口, 服 务 程 序 名 为PFBCdas。 其 二 是 应 用 程 序 功 能 函 数MainWndProc。 下 面 是 程 序 清 单( 因 篇 幅 关 系, 在 此 省 去WinMain 函 数)。 <BR> #define AD_Interval 1000 //采样周期为 1000ms<BR> #define base 0x280 // A/D采样板基地址<BR> /* base+k (k=1,2,…14)为A/D板各寄存器地址 */<BR> #include <BR> #include <BR> #include <BR> #include <BR> #include <BR> #include <BR> #include <BR> #include <BR> #include <BR> int i, j, k , AD_Status, idTimer;<BR> int AD_Data[8][16]; // A/D数据存储单元 <BR> int DdeAdviseStatus=0;<BR> char buf[64], DDEbuf[2048]; //数据暂存缓冲器 <BR> char szAppName[]="PFBCdas"; //服务程序名<BR> char szDdeTopic[]="AD001"; //主题名 <BR> char szDdeItem[]="DATA"; // 数据项名<BR> long FAR PASCAL _export MainWndProc(HWND, UINT, UINT, LONG) ;<BR> long FAR PASCAL _export MainWndProc (HWND hwnd, UINT message, UINT <BR> wParam, LONG lParam) <BR> //应用程序功能函数 <BR> {<BR> ATOM aAppName,aTopic;<BR> ATOM aItem;<BR> GLOBALHANDLE hDdeData;<BR> DDEDATA FAR *lpDdeData;<BR> static HWND hwndClient;<BR> switch (message)<BR> { <BR> case WM_CREATE:<BR> idTimer=SetTimer(hwnd,NULL,AD_Interval,NULL); <BR> //打开定时器<BR> outportb(base+11,0x10); //选择软件触发方式<BR> outportb(base+9,1); //选择输入信号放大倍数为10<BR> outportb(base+14,0);<BR> outportb(base+13,0); //清A/D完成位<BR> outportb(base+10,0); //选择通道0<BR> return 0;<BR> case WM_TIMER:<BR> for(i=0;i<6;i++)<BR> for(j=0;j<16;j++) //采样点为6*16=96个<BR> {<BR> outportb(base+13,j); <BR> outportb(base+10,i); <BR> outportb(base+12,0); //启动A/D转换<BR> do AD_Status=inportb(base+5);<BR> while ((AD_Status&0x10)==0x10); <BR> //判转换是否结束? <BR> AD_Data[i][j]=(inportb(base+5)&0x0f)*256+inportb(base+4); <BR> /* 读A/D转换后的数字值 */<BR> }<BR> _strdate(buf); //取采样日期<BR> strcpy(DDEbuf,buf);<BR> strcat(DDEbuf,",");<BR> _strtime(buf); //取采样时间<BR> strcat(DDEbuf,buf);<BR> strcat(DDEbuf,",");<BR> for(i=0;i<6;i++)<BR> for(j=0;j<16;j++)<BR> {<BR> char temp[32];<BR> strcat(itoa(AD_Data[i][j],buf,10),",");<BR> /*各采样数据之间以逗号分隔*/<BR> strcat(DDEbuf,buf);<BR> }<BR> if(DdeAdviseStatus!=0) //如果建立了DDE服务<BR> {<BR> aItem = GlobalAddAtom (szDdeItem) ;<BR> //添加DDE数据项为全局原子<BR> hDdeData = GlobalAlloc (GHND | GMEM_DDESHARE,<BR> sizeof (DDEDATA) + strlen (DDEbuf)) ;<BR> /*给采样数据分配全局内存块*/<BR> lpDdeData = (DDEDATA FAR *) GlobalLock (hDdeData) ;<BR> lpDdeData->fResponse = 0 ;<BR> lpDdeData->fRelease = 1 ;<BR> lpDdeData->fAckReq = 0 ;<BR> lpDdeData->cfFormat = CF_TEXT ;<BR> //采样数据为文本格式<BR> lstrcpy ((LPSTR) lpDdeData->value,DDEbuf) ;<BR> /*将采样数据从缓冲器放至DDE内存*/<BR> GlobalUnlock (hDdeData) ;<BR> if(!PostMessage(hwndClient,WM_DDE_DATA,hwnd,<BR> MAKELONG(hDdeData,aItem))) //发送DDE数据<BR> {<BR> GlobalFree(hDdeData); <BR> //若发送失败,则释放资源<BR> GlobalDeleteAtom(aItem); <BR> }<BR> }<BR> return 0;<BR> case WM_DDE_INITIATE: //DDE初始化<BR> hwndClient=wParam;<BR> hdc=GetDC(hwnd);<BR> aAppName=GlobalAddAtom(szAppName);<BR> aTopic=GlobalAddAtom(szDdeTopic);<BR> if ((LOWORD (lParam) == NULL || LOWORD (lParam) == aAppName)<BR> && (HIWORD (lParam) == NULL || HIWORD (lParam) == aTopic))<BR> { // 发送服务程序名和主题名<BR> SendMessage(hwndClient,WM_DDE_ACK,hwnd,<BR> MAKELONG(aAppName,aTopic));<BR> } <BR> else<BR> {<BR> GlobalDeleteAtom (aAppName) ;<BR> GlobalDeleteAtom (aTopic) ;<BR> }<BR> return 0 ;<BR> case WM_DDE_TERMINATE: //关闭DDE服务<BR> hwndClient=wParam; <BR> PostMessage (hwndClient, WM_DDE_TERMINATE, hwnd, 0L) ;<BR> return 0 ;<BR> case WM_DDE_ADVISE: //建立DDE服务<BR> DdeAdviseStatus=1; //已建立DDE服务标志<BR> hwndClient=wParam;<BR> aItem=HIWORD(lParam);<BR> if(!PostMessage(hwndClient, WM_DDE_ACK, hwnd,<BR> MAKELONG(0x8000,aItem))) //发送DDE应答<BR> {<BR> GlobalDeleteAtom(aItem);<BR> }<BR> return 0;<BR> case WM_DESTROY: //程序失败处理<BR> PostQuitMessage (0) ;<BR> return 0 ;<BR> }<BR> return DefWindowProc (hwnd, message, wParam, lParam) ;<BR> }</P><P> 2. 建 立VFP 环 境 下 的 客 户 端 程 序 <BR> ---- 首 先 建 立 和 服 务 程 序 之 间 的 通 道, 然 后 将 服 务 程 序 传 递 来 的 数 据 放 至 字 符 串DATA 内, 再 通 过 自 定 义 函 数recdata 将 采 样 数 据 存 入 数 据 库 中 待 用。 下 面 是 客 户 程 序 清 单。 <BR> PROCEDURE getdata<BR> PUBLIC mchannel<BR> mchannel = DDEInitiate('PFBCdas','AD001') <BR> &&建立客户程序和服务程序间的通道 <BR> IF mchannel !=-1<BR> =DDEadvise(mchannel,'DATA','recdata',2)<BR> &&建立DDE热连接,数据项为DATA<BR> ENDIF<BR> RETURN</P><P> PROCEDURE recdata &&用户自定义函数<BR> PARAMETERS channel,action,item,data,format,status<BR> PRIVATE newdata<BR> newdata=""<BR> IF action='ADVISE' &&若连接成功<BR> newdata=DATA &&将采样数据传递至newdata<BR> do process with newdata &&调用数据处理程序 <BR> ELSE<BR> IF action='TERMINATE' <BR> = DDETerminate(mchannel) &&关闭通道<BR> ENDIF<BR> ENDIF<BR> RETURN</P><P> PROCEDURE process<BR> PARAMETER newdata<BR> PRIVATE i,loc1,loc2<BR> DIMENSION gdata(98)<BR> * 从字符串 newdata中取采样值<BR> gdata(97)=CTOD(left(newdata,8)) &&取日期值<BR> gdata(98)=SUBSTR(newdata,10,8) &&取时间值<BR> * 从字符串newdata的相邻逗号间取采样值,<BR> 并将采样值转化为毫伏值<BR> FOR i=3 TO 98<BR> loc1=ATC(",", newdata, (i-1))<BR> loc2=ATC(",", newdata, (i))<BR> gdata(i-2)=VAL(SUBSTR(newdata,(loc1+1),(loc2-loc1)))<BR> *0.024414062<BR> ENDFOR<BR> IF USED("onedata")<BR> SELECT onedata<BR> ELSE<BR> SELECT 0<BR> USE onedata ALIAS onedata<BR> &&打开数据库onedata<BR> ENDIF<BR> APPEND FROM ARRAY gdata<BR> &&将数组gdata中的转换数据添加到数据库中 <BR> RETURN </P><P> ---- 联 系 地 址: 南 京 市 东 南 大 学 热 能 工 程 研 究 所 <BR> ---- 邮 编:210096 <BR> ---- 联 系 人: 周 卫 平 <BR> ---- 电 话:(025)3794191 <BR> ---- EMAIL 地 址:qhye@seu.edu.cn
 

状 态: 离线

公司简介
产品目录

公司名称: 中华工控网
联 系 人: 客服中心
电  话: 0755-26546361
传  真: 0755-26585268
地  址: 深圳市南山区创业路现代城华庭1栋6A
邮  编: 518054
主  页:
 
该厂商相关技术文摘:
智能仪器仪表的发展特点与前景分析
电动机性能虚拟仪器测试系统设计与实现
视频监控护航高铁安全运营
基于PLC,触摸屏及变频器对吹膜机的改造
永宏PLC应用于自助图书借还终端机
基于永宏PLC的GSM通讯原理及其应用
改善汽车生态学、安全性和舒适性,四大测试分析是关键
改善汽车生态学、安全性和舒适性,四大测试分析是关键
数控技术的发展趋势及产业化
数控技术发展战略与发展途径的思考
用Energid 的软件进行机器人的抓取和操作
如何借助RFID技术升级企业信息管理水平
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved