交换及使用协议达到传递数据的同步。DDE协议可应用两种类型的DDE应用程序,第一种是基于消息的DDE应用程序,第二种是动态数据交换管理库(DDEML)应用程序。DDE应用程序可分为4种类型,客户、服务器、客户/服务器、监视器。其中,客户应用程序从服务器应用程序请求数据或服务;服务器应用程序响应客户应用程序的数据或服务请求。DDE应用程序采用3层识别系统从其他的DDE应用程序来识别它们本身,这3层分别是:应用程序名(进行DDE对话的双方名称) ,主题(被讨论的数据域) ,项目(被讨论的特定数据对象)。通过3层识别进行初始化并建立会话,进行会话的交换,交换结束后便是会话的中止,客户应用程序或者服务器应用程序都能终止会活。
2)InTouch的DDE接口
InTouch既可以作为服务器也可以作为客户端,当它作为服务器时,当另一WINDOWS应用程序从InTouch中请求数据值时,它必须知道3个I/O地址项:应用程序名(VIEW),主题名(TAGNAME),项目名(ActualTagname)。当InTouch作为客户端时,它提供的DDE函数有WWExecute,WWPoke,WWRequest。其中,WWExeute将要发送的命令字符串发送到指定的应用程序和主题;WWPoke将TextValue的值被发送到指定的应用程序、主题和项目,必要时使用tringFrom Intg或StringFromReal函数对其进行转换; WWRequest将特定应用程序、主题和项目中的DDE值将返回给ValueMsg_Tag,值将作为字符串返回给消息型标记,如果该值为一个数字,可以使用StringToIntg或StringToReal函数对其进行转换。
3)MATLAB的DDE接口
MATLAB同样既可以做服务器也可以做客户端,当MATLAB做服务端时,其应用程序名为Matlab;其主题分为两类,分别为System和Engine;每类主题又包含几个不同的项目,最常用的是Engine主题和它所包含的EnEvalString(客户把指令发进MATLAB计算)、EngStringResult (索取文字结果)、EngFigureResult (索取图形结果) 3个项目。当Matlab做客户端时,它提供了7个客户端函数: ddeinit、ddeadv、ddeexec、ddepoke、ddereq、ddeterm、ddeunadv。使用ddeinit函数建立与服务器的对话通道;在所建立的通道上采用ddereq函数向服务器所要数据,返回值是存有数据的矩阵;使用ddeexec函数发出给服务器应用程序执行的命令;使用ddepoke函数向服务器发送数据;使用ddeadv和ddeunadv分别是建立和删除热链接(热链:服务器的数据有变化时,服务器直接把数据送给客户,由客户对这些数据进行处理) ;使用ddeterm函数终止与服务器之间的DDE会话。
4)InTouch和MATLAB通讯的实现
InTouch和MATLAB都既可以做客户端又可以做服务器。由于InTouch提供的脚本程序中函数较少,且函数的应用功能远不如MATLAB提供的强大,提供的DDE接口函数,也没有MATLAB提供的函数应用方便。所以,本文采用MATLAB做客户端, InTouch做服务器,分别采用M文件,和S函数(采用M语言编写)来实现它们之间的通信,如图2-8,并通过实例说明其通讯原理。
图2-8 INTOUCH和MATLAB之间的通信
实例:在开发船舶电站模拟器时,采用InTouch进行人机界面的开发,采用MATLAB进行相关运算及建立电站的数学模型。例如监视某负载的功率,需要InTouch实时采集其电流和电压信号,在MATLAB环境里将InTouch采集的电流和电压信号相乘,得到的瞬时功率值返回给InTouch,在InTouch中以图形方式(功率表)直观显示出来。
方法一,采用M文件实现InTouch与MATLAB通讯。
M文件编写如下:
chann = ddeinit (‘view’, ’tagname’) ; %建立Matlab与InTouch之间的通
讯通道
…
while switch = = 1 %通过循环实现Matlab对InTouch的数据采集
pause (0.01) ; %暂停
rc = ddereq ( chann, ’current’) ; %采集InTouch中标记名为current的值
rv = ddereq ( chann, ’voltaga’) ; %采集InTouch中标记名为voltaga的值
w = rc*rv;
ra = ddepoke ( chann, ’power’,w) ; % w的值赋给InTouch中标记名为power的变量
…
end
ddeterm ( chann) ; %关闭对话通道chann
方法二,采用S函数实现InTouch与MATLAB通讯。
使用S函数实现InTouch与MATLAB通讯,是在MATLAB的SIMULINK环境下进行的,它分为两个模块,一个是MATLAB采集InTouch中的数据,另一个是MATLAB向InTouch发送数据,通过这两个模块共同作用来实现InTouch与MATLAB之间的数据通讯。下面
分别给出S函数部分源码并通过注释介绍如何来实现通讯。
MATLAB从InTouch中采集数据的S函数:
function [ sys, x0, str, ts ] = InTouch2simulink ( t, x, u, flag,
chann) %chann是S函数传递的参数
switch flag,
case 0
[sys, x0, str, ts] =mdlInitializeSizes( t, x, u, chann) ;
% S函数的初始化
case 3
sys =mdlOutputs( t, x, u, chann) ; % S函数的输出
case {1, 2, 4, 9}
sys = [ ]; %没有定义的flag
otherwise
error ( [‘Unhandled flag = ’, num2str ( flag) ] ) ;
% 容错处理
end;
function [ sys, x0, str, ts] =mdlInitializeSizes( t, x, u, flag, chann)
…
sizes. NumOutputs = 2; %输出参数的数量
sizes. Num Inputs = 0; %输入参数的数量,没有u所以为零
sizes. DirFeedthrough = 0; %没有直接馈通所以为零
…
function sys =mdlOutputs( t, x, u, chann) %输出所调用的函数
if chann = = 0
disp (‘DDEfaild! ’) ;
else
rq (1) = ddereq ( chann,‘current’) ; %采集INTOUCH中标记名为current变量的数据
rq (2) = ddereq ( chann,‘voltaga’) ; %采集INTOUCH中标记名为voltaga变量的数据
for i = 1: 2
sys( i) = rq ( i) ;
end
end
当Matlab向InTouch发送数据时,除mdlOutput函数不同外(采用ddepoke函数) ,其他的基本相似。
将以上函数进行封装便可以在SIMULINK环境中运行。在运行时,首先打开InTouch的windowviewer,并向MATLAB命令窗口输入chann = ddeinit (‘view’,‘tagname’)来建立MATLAB与InTouch的连接。
2.5 本章小结
本章介绍了几种实现组态软件扩展的方法,对每种方法都进行了较为详细的说明和介绍,并附有一些实际运用的例子,成功实现了组态软件控制算法的扩展。着重介绍了DDE协议,并以InTouch和MATLAB之间的动态数据交换为例详细的介绍两种实现通信的方法,InTouch实现现场的数据采集通过DDE协议传到MATLAB中,在MATLAB中计算出结果后再将数据传回InTouch中。
基于美国Wonderware公司出品的InTouch专业组态软件具有可视化编程、使用简单、组态灵活、组网方便、与流行的数据库有良好的接口、可以和许多应用程序很好的协同工作等优点,本次设计选用组态软件是InTouch。选用的先进控制策略是模糊控制,在MATLAB的环境下实现。采用DDE技术实现二者之间的通信,在MATLAB中编写M文件来实现两者之间的数据交换,达到扩展组态软件的控制算法的目的
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>