新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于DDE协议的Modbus Plus与Ethernet数据交换

基于DDE协议的Modbus Plus与Ethernet数据交换

作者:时间:2012-08-14来源:网络收藏

  (2) 通过dde协议的服务名,主题名和项目名来访问具体某个项目的数据

  先定义dde的服务名和主题名

tchar szapp[] = text("mbplus"); //服务名
tchar sztopic4[]=text("plc4"); //主题名
tchar szwidth[]=text("400401"); //项目名
tchar vlwidth[16]; //储存从dde服务器返回的数据
hsz hszwidth; //项目的dde标识

  //项目名的命名规则具体可以查看mbplus程序的说明,这里400401表示的是项目在plc中的地址,这是一个//16位的整形数

hconv4=ddeconnecttotopic(idinst,szapp,sztopic4,hsztopic4);
if( hconv4 != null )
{
ddeautorequest(idinst,hconv4,szwidth,hszwidth);
}

  此处的ddeconnecttotopic和ddeautorequest为自定义的函数

hconv ddeconnecttotopic(dword idddeinst, lpctstr szapp, lpctstr
sztopic, hsz * hsztopic)
{
hsz
hszapp=ddecreatestringhandle(idddeinst,szapp,cp_winunicode);
*
hsztopic=ddecreatestringhandlew(idddeinst,sztopic,cp_winunicode);
return ddeconnect(idddeinst,hszapp,*hsztopic,null);
}

  使用ddecreatestringhandle来获取服务器和主题名的字符句柄,使用ddeconnect来建立指定服务下的指定的主题的连接。之后使用ddeautorequest函数来向dde服务器请求置顶项目名的数据,在数据发生变化后dde服务器会自动将新的数据发送给客户端,客户端在回调函数中就可以获取到新的数据,具体方法见下文。如果某个主题下有多个项目需要处理,都用ddeautorequest来处理即可,此函数的实现如下:

void ddeautorequest(dword idddeinst, hconv hconv, lpctstr
szitem, hsz * hszitem)
{
*hszitem=ddecreatestringhandle(idddeinst,szitem,cp_winunicode);
hddedata hdata=ddeclienttransaction
(null,0,hconv,*hszitem,cf_text,xtyp_advstart| xtypf_ackreq,5000,
null);
}

  接下来就可以通过dde的回调函数来获取数据了。

hddedata callback ddecallback(uint utype,uint ufmt,hconv
hconv,hsz hsz1,hsz hsz2,hddedata hdata,
dword dwdata1,dword dwdata2)
{
switch( utype )
{
case xtyp_advdata: //处理dde数据
if( ufmt != cf_text )
return dde_fnotprocessed;
memset(szbuffer,0,64); //初始化缓冲区
datalen=ddegetdata(hdata,null,64,0);//获取数据的长度
ddegetdata(hdata,(unsigned char* )szbuffer,datalen,0);//获取数据
if( hsz1==hsztopic4 hsz2 == hszwidth ) //判断数据对应于那个数据项,并作出具体处理
{
_atoflt(fltval,szbuffer); //dde的数据以字符串形式创送过来的,这里将它转换成数值
ptele1101->msgblock1.stripwidth=fltval.f; //将数字存入缓冲区
}
return ( hddedata )dde_fack;
}
return 0;
}

  本例中dde回调函数要处理的dde项目不止一个,任意一个dde项目的值发生变化时,回调函数都会被自动调用一次,具体实现时只需要用if语句对hsz1和hsz2进行逐一比较即可处理所有的项目。缓冲区ptele1101用于存储通过以太网发送到板型仪的数据,下文中将详细介绍。



评论


相关推荐

技术专区

关闭