logo资料库

DDE通讯在_组态王_中的应用.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
Π 2 第 19 卷 第 5 期 2003 年 10 月      哈 尔 滨 商 业 大 学 学 报 (自然科学版) Journal of Harbin University of Commerce Natural Sciences Edition     Vol. 19 No. 5 Oct. 2003 DDE 通讯在“组态王”中的应用 (上) 于 足 恩 (大庆联谊股份有限公司 ,黑龙江 大庆 163852 ) 摘  要 :介绍了 DDE 通讯的通讯机制和原理 ,详细阐述了如何实现“组态王”做客户对应通信对象做 服务器的程序编写过程和方法 ,并给出用 VC + + 编写的服务器应用程序. 关键词 :DDE 通讯 ; 组态王 ; VC + + 中图分类号 :TP311      文献标识码 :B      文章编号 :1672 - 0946(2003) 05 - 0578 - 03 Study on application of DDE communication in KingVie w YU Zu en (DaQing Lianyi Ltd. , Daqing 163852 ,China) Abstract : Introduced the principles and mechanisms of DDE communication. And presented how to implement DDE communication by DDEML with KingView serving as client and its communica tion partner serving as server in detail , and took the procedure and approach of implement DDE with VC + + program language , and corresponding example program for reference. Key words :DDE communication ; KingView ; VC + +   工业过程控制或者测量过程中 ,一般过程比较 复杂 ,传感器比较多 ,各中板卡接口标准不一样 ,程 序设计工作量大 ,复杂且可靠性差 ,工控软件的出 现解决了这一难题. 它利用 Windows 多任务系统中 的动态数据交换 DDE(Dynamic Data Exchange) 实现 进程间的通信 ,解决了不同平台之间的数据交换. 但是工控软件实时性差 ,这是需要利用 VC 等实时 性强 的 软 件 编 程 或 者 自 己 制 作 板 卡 然 后 用 VC + + 写驱动 ,这两者之间也是靠 DDE 通信联系的 , 这就需要利用工控软件对 DDE 的支持 ,自己编写 DDE 通信程序. 2000 在 Windows 环境下 , 包括 Windows 98 NT 等 ; (2) 先进的图形 、动画功能 ,丰富的图库 ,开发简便 , 周期短 ,界面美观 、友好 ; (3) 在其公司网站上有各 种应用实例 ,方便移植 ; (4) 丰富的硬件支持功能 , 支持工业控制中大部分的板卡 ,接口简单 ,便于操 作 ; (5) 提供了上百个函数 ,大大简化了编程过程 , 减轻了工作量 ,提高了工作效率 ; (6) 对于典型数据 库的支持 ,使得数据的操作很容易实现 ; (7) 强大的 报表功能 ; (8) 具有一定网络支持功能 ; (9) 具有动 态数据交换功能 (DDE) ,这使得它可以和 Windows 环境下的大部软件或开发平台进行数据传递. 1  “组态王”工控软件简介 2  DDE 概述 KingView 工控软件是近来很受欢迎的国产软 件包之一 ,以其价格低廉 、使用简单 、界面友好 、服 务好等优势在多个项目中获得成功应用. “组态王”特点包括 : (1) 全中文界面 ,可以运行 动态数据交换 DDE 是 Windows 环境提供的一 种基于消息的进程间通信技术协议 ,DDE 会话实 现进程间通信的手段 ,它采用客户 服务器模式 ,启 动会话并要求接收数据的进程是客户进程 ( Cli 收稿日期 :2003 - 03 - 25. 作者简介 :于足恩 (1969 - ) ,女 ,工程师 ,研究方向 :计算机检测. © 1994-2006 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
第 5 期            于足恩 :DDE 通讯在“组态王”中的应用 (上) ·975· ent) ,而响应客户请求提供数据的进程是服务器进 程 (Server) . 传统的 DDE 会话通过进程间消息传递 实现 ,DDE 协议是 1 组预定义的消息 ,它能被所有 进程识别. DDE 会晤 (Conversation) 的基本类型有 3 种 :冷链接 、热链接和温链接. 冷链接 ,每启动 1 次 会晤传递 1 次数据 ,会晤结束 ;热链接客户接连 1 个会晤后 ,每当服务器的数据发生变化 ,服务器就 继续重发数据 ;温链接服务器数据变化会发送通知 给客户 ,客户为了得到新数据需要发送请求 1 . 由 于使用原子 (Atom) 来代替标志数据的字符串 ,涉及 到原子和全局内存句柄建立和删除 ,使用起来很复 杂 ,极不方便. Windows3. 1 以后提供了简化的 DDE 管理库 DDEML (Dynamic Data Exchange Manage Li brary) . DDEML 通过提供高级函数调用层 ,把程序 与 DDE 的消息机制隔离开来 ,使用 DDEML 的程序 使用回调函数响应 DDE 消息 ,由于 DDEML 创建在 DDE 消息传递系统上 ,因此 2 种使用 DDE 的方法 是兼容的. 因为 DDEML 使用简单 ,所以下面介绍的 概念是 DDEML 的 ,有些与 DDE 不同. 当客户向服务器请求数据时 ,它必须能标识它 所希望的数据类型 ,用分别称为“服务”、数据“话 题”和“条目”的 3 个字符串可以完成这项工作. 每 个服务器程序只有 1 个服务名 ,所有的 DDE 服务 器至少支持 1 个主题 ,在每个主题中 ,DDE 服务器 支持 1 个或多个数据项. 3  利用 DDEML 实现进程通信 DDEML 通信的核心是业务 ( Transaction) . 客户 和服务器都是通过 DDEML 进行操作的. 首先客户 图 1  DDEML 通信示意图 Figure 1 Sketch of DDE communication by DDEML 程序发出请求建立链接的会晤 ,服务程序相应后边 建立链接 ,若链接成功 ,则返回会晤句柄. 其次 ,客 户程序需要数据时发出请求会晤 ,若成功得到数据 句柄 ,服务器便向其提供所需数据 2 . 第三服务器 在数据变化时 ,DDEML 就会发消息调回调函数 ,使 得客户数据更新. 同时客户程序可以向服务器发送 命令 ,让服务器执行某项操作. 注意 ,服务器同时还 可以是客户 ,客户也可以同时是服务器 ,但是在 1 次会晤中 ,只能由 1 个服务器和 1 个客户. 4  “组态王”和 Windows 实时通信 “组态王”一般用来做上层平台或界面 ,用 VC 程序做底层处理或者信号采集 ,所以一般“组态王” 做客户 ,VC 程序做服务器. 4. 1  服务器程序设计 DDE 通 信 中 服 务 器 的 动 作 步 骤 3 : 1. 调 用 DdeInitialize 初始化 DDEML ,提供 1 个 DDE 回调函 数 ;2. 服务器的回调函数收到 XTYP CONNECT 业务 , 如果可以得到话题和条目 , 回调函数返回 TRUE;3. 服务器回调函数收到 1 个 XTYP RE QUEST 业务 ,如果服务器可以提供数据 ,它就通过 调用 DdeCreateDataHandle 来创建 1 个内存块 ,将被 请求的数据拷贝到那块内存中 ,并返回 HDDEDA TA 句柄 ;4. 服务器得到 1 个 XTYP DISCONNECT 业务 , 告 诉 服 务 器 会 晤 结 束 ; 5. 如 果 不 再 需 要 DDEML 服 务 器 调 用 DdeUninitialize 释 放 占 有 的 DDEML 资源. 第 1 步 要把 DDEML. H 头文件包含在程序中 这样我们才能够利用 DDEML 封装的 API 函数. 第 2 步 在使用 DDEML 之前 ,先调用下面函数 在 DDEML 中注册自己 ,得到 1 个应用程序实例识 别符. 回调函数 FAIL SKIP SKIP CONNECT CONFIRMS CONNECTIONS 程序实例识别符 if ( : :DdeInitialize ( &dwDDEInst ,      (PFNCALLBACK) &DDECallback ,         ! (CBF   | CBF   | F   ,0l) ! = DMLERR   {   AfxMessageBox(“Initial error”) ;   } 篇幅的限制 ,下面代码去掉了错误处理部分. 第 3 步 为服务名 (“read”) 、主题名 (“Topic”) 和 条目名 (“Item”) 创建串句柄. DDEML 使用串句柄代 替原子. DISCONNECTS) NO ERROR) hszService = DdeCreateStringHandle (     dwDDEInst ,“read”,0) ; hszTopic = DdeCreateStringHandle (     dwDDEInst ,“Topic”,0) ; hszItem = DdeCreateStringHandle (     dwDDEInst ,“Item”,0) ; © 1994-2006 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
ΠΠ ΠΠ 哈 尔 滨 商 业 大 学 学 报 ( 自 然 科 学 版 )             第 19 卷 ΠΠ ΠΠ ΠΠ ·085· ΠΠ 第 4 步 注册服务名 ,注意不同于第 2 步 ,第 2 步注册整个应用程序 已经得到的程序识别符 DdeNameService (dwDDEInst ,          hszService ,     NULL ,DNS 第 5 步为了保证数据变化时 ,客户数据能够及 服务名字符串句柄 REGISTER) ; 时更新 ,每当服务器数据变化时发送消息 XTYP ADVREQ ,调用回调函数. 服务程序识别符 主题名字符串句柄 条目子符串句柄 DdePostAdvise (dwDDEInst          ,hszTopic       ,hszItem) ; 第 6 步上面所有的外围工作都做好了 ,下面就 要进入核心部分 ,写回调函数. 从上面分析知道 ,无 论客户程序还是服务器程序都是通过回调函数从 DDEML 取得信息的 ,如图 1 ,下面简要介绍几个重 要的消息. XTYP ADVSTART 通知服务器 ,1 个客户机 正在与服务器就分别由字符串据柄 hsz1 和 hsz2 标 志的话题和条目开始 1 个报告循环. 返回 TRUE 报 告有效 ,否则无效. XTYP CONNECT 通知服务器 ,1 个客户机已 为 1 个话题和服务请求链接 ,话题和服务分别由字 符串据柄 hsz1 和 hsz2 标志. 返回 TRUE 建立 1 个会 晤 ,否则拒绝建立会晤. XTYP ADVREQ 通知服 务器 1 个报告还没有完成 ,话题名和条目名分别在 字符串据柄 hsz1 和 hsz2 中. XTYP EXECUTE 通知服务器 ,1 个客户机已 经为服务器的执行发送了 1 个命令 hsz1 指定话 题. XTYP REQUEST 通知一个服务器 ,1 个客户 机已为一个话题和条目请求发送数据 ,这个话题和 条目分别由字符串据柄 hsz1 和 hsz2 来标志. XTYP DISCONNECT 通知服务器或者客户 机 ,会晤结束. 下面给出 1 个简单的服务器回调函数. HDDE DATA CALLBACK DDECallback 函数名 (指针) 早在第 2 步就调用了      (WORD wType ,   WORD wFmt ,   HCONV hConv ,   HSZ hsz1 ,   息含义不同 同上 HSZ hsz2 , 会晤句柄 字符串句柄 ,对应不同的消 HDDEDATA hData , DWORD dwData1 , DWORD dwData2) { int dwLength ; HDDEDATA hDdeData = NULL ; UINT ui = 0 ; CONVINFO ci ; switch (wType) { case XTYP DISCONNECT: : :PostMessage (theApp . m pMainWnd - > GetSafeHwnd () ,WM QUIT ,0 ,0) ; break ; case XTYP ADVSTART: case XTYP CONNECT: return ( HDDEDATA) TRUE ; case XTYP EXECUTE : AfxMessageBox(“excute”) ; case XTYP ADVREQ : case XTYP REQUEST:   dwLength = 64 ; return ( : : DdeCreateDataHandle ( dwDDEInst , ( un 存放共享缓冲区指针 条目字符 数据长度 0 , hszItem , ) Buffer , signed char dwLength , 串据柄 wFmt ,0) ) ; case XTYP ADVSTOP :   return ( HDDEDATA) TRUE ; default :   return NULL ; }   return ( HDDEDATA) NULL ; } 第 7 步 业务结束 ,结束会晤 ,释放字符串据 柄. if ( ! DdeDisconnect (hConv) )   AfxMessageBox(”断开连接错”) ; DdeNameService (dwDDEInst ,hszService ,   NULL ,DNS-UNREGISTER) ;    清除注册的服务名 DdeFreeStringHandle ( dwDDEInst , hszService) ; 据柄 DdeFreeStringHandle (dwDDEInst ,hszTopic) ; DdeFreeStringHandle (dwDDEInst ,hszItem) ; DdeUninitialize (dwDDEInst) ; 释放 (下转 583 页) © 1994-2006 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
第 5 期              黄正洪 ,等 :变系数 KdV 方程的显示精确解 ·385· 程的精确解 ,还可以此方法求得更一般高阶方程的 精确解. 参考文献 1  Wang Mingliang . Exact solutions for a compound KdV - Burgers equation J . Physics Letters A ,1996 ,213 :279 - 287. 2  范恩贵. 齐次平衡法 、Weiss - Tabor - Carnevale 法及 Clarksorr Kruskkal 约化法之间的联系J . 物理学报 ,2000 ,49 :1409. 3  范恩贵 ,张鸿庆. 齐次平衡法若干新的应用J . 数学物理学报 1999 ,19 :40 - 47. (上接 580 页)    释放程序占用的 DDEML 资源 说明 : 上面程序中没有用到 DdeCreateDataH andle 来创建 1 个共享内存块 ,因为我把需要传递 的数据放到了 Buffer 变量中 ,而 Buffer 是全局变量 , 在我的程序中它是从串口读取的外部测量数据 ,而 每当数据变化时就调用第 5 步. 4. 2  客户程序设计 “组态王”支持 DDE 功能既可以做客户机也可 以做服务器 , 做为客户机它建立的是热链接. 新建 DDE 设备 ,对象名任意 ,服务程序名 :Read ,话题名 : Topic ,在定义 DDE 变量的时候 ,项目名 : Item. 这样 就完成了客户机设置. 注意 :DDE 服务一般要求服务器先启动 ,这样 可以自然顺利链接 ,但是如果服务器没有启动可以 调用 WinExec 先启动服务器 ,或者客户先启动了可 以发送 DdeConnect ,重新建立链接 , 实际上“组态 王”中的重新建立链接就是这么做的. 5  结语 工控软件大大缩短了工业控制过程设备开发 提供了极大方便 ,由其是它的 DDE 功能 ,使得它的 应用更普遍. 本文详细介绍了工控软件和 Windows 系统之间的 DDE 通信 ,就应用最广泛的组态软件 做客户机形式给除了详细的例子 ,方便工程人员参 考. 受篇幅所限没有给出完整的程序 ,至于 DDE 客 户程序的编写将在本文的下篇中讨论. 参考文献 : 1  CHARLES P. Window95 程序设计 M . 北京 :清华大学出版社 , 1997. 2  马亚龙 ,王精业 ,郭齐胜 ,等. DDE 通讯在分布式实时仿真软 件中的应用J . 计算机仿真 ,2003 (2) :60 - 63. 3  NABAJ YOTI B. Visual C + + 开发指南 (第 2 版) M . 西安 :电 子工业出版社 ,1998. © 1994-2006 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
分享到:
收藏