当前位置:首页 > 工业控制 > 工业控制技术文库
[导读] 1、引言 modbus plus(以下简称mb+)是一种针对工业控制应用的本地局域网系统。以太网是当今现有局域网采用的最通用的通信协议标准。其具有低成本、高可靠性、高速率、开放性好等特点

1、引言

modbus plus(以下简称mb+)是一种针对工业控制应用的本地局域网系统。以太网是当今现有局域网采用的最通用的通信协议标准。其具有低成本、高可靠性、高速率、开放性好等特点,在工控领域得到了广泛的应用。

动态数据交换(dde)是windows操作系统一直保持兼容的一种应用程序间的数据通信方式。对于很多直接和硬件打交道的应用程序,尤其是plc编程软件,是一种较为可靠的通信方式。

本文通过某钢厂单机架平整机板型改造过程中的实际应用,介绍使用vc2005在windows下实现pc与mb+网的dde通信并通过以太网实现与板型仪plc的数据交换。

2、系统简要说明

本系统如图1所示,包括生产控制plc组,mb+网,pc服务器,100m以太网,板型控制系统。通过pc服务器实现互联。

图1 单机架平整机板型控制系统

生产控制plc组由mb+网来连接,pc机上使用一块sa-85的pci卡来连接到mb+,用于访问各节点上的plc。pc机上另外使用一块pci接口的以太网卡连接到以太网。板型仪提供了以太网接口,与pc机接入同一个局域网。

pc机上安装mb+网的dde服务程序,以及本文介绍的自编程序。dde服务程序通过mb+网获取plc上的数据,自编程序使用dde技术获得数据,打包后使用tcp协议发送给板型仪。板型仪通过tcp协议将各种测量数据和状态信号发给pc服务器,相关数据再通过dde协议送dde服务程序,最后通过mb+网送到相应的plc。

3、系统的具体实现

3.1 dde server软硬件安装方法

dde基于用户/服务器原则,通过建立应用程序间的对话连接,根据不同的主题和项目进行数据通信。为了从服务器获取数据,用户使用一种固定的3级特殊访问方式,这3级访问分别为:服务(service)、主题(topic)和数据项(item)。

不同的硬件平台所使用的dde数据通信硬件设备也不同,本文介绍的数据通信方法是针对mb+网而言的。pc平台上使用sa-85的pci卡来连接mb+网。使用前需要配置好sa-85的网络连接。

软件上,使用wonderware公司提供的io server组件中的modicon modbus

plus(以下简称mbplus)来连接mb+并提供dde的方式来访问数据的接口。此工具运行后如图2所示。

图2 mbplus连接

要使用此工具,还需要对它进行一些配置。从configure菜单中选择adapter card setting,设置需要连接的适配器,因为我们只安装了一个mb+的适配器,所以使用默认配置。之后就可以开始配置dde服务了。我们需要给每一个需要访问的mb+网上的设备按照dde协议定义一个topic。选择configure菜单下的topic definiTIon,进行topic的配置,如图3。

图3、topic配置

这里的topic name 就是之后访问dde服务的topic需要使用的名称,每个topic需要定义不同的名称,本系统共连接5个mb+网上的plc,分别定义为plc1、plc2、plc3、plc4、plc5。slave path 处定义的是不同设备的节点地址。配置好以后就可以使用dde协议来访问mb+网上的数据了。

3.2 编程实现

在完成了mb+的dde数据通信安装与设置后,就要在用户程序中进行编程,建立dde对话,控制数据通信流程。本文介绍vc2005的dde通信方式。事实上,vc2005并不直接与dde server进行dde对话,它是通过windows操作系统提供的ddeml(dde通信管理库)来管理dde通信具体工作的。该管理库的使用方法如下:

(1) ddeml的初始化工作

加载头文件,.#include “ddeml.h” //在工程中引用ddeml库然后按照dde server提供的3级访问方式建立vc与ddeserver的对话。此时service为mbplus,topic为plc4。通过选择不同的item及相应dde函数可以完成接收过程数据、发送控制命令、获取系统状态等工作。

使用ddeml后,实际上客户和服务器之间的多数会话并不是直达对方的,而是经由ddeml中转,即用回调函数处理dde交易(transacTIon)。在调用其他ddeml函数前,必须调用ddeiniTIalize()函数,以获取实例标识符,注册dde 回调函数。通过回调函数来处理dde的事务。

本例中使用如下方法来初始化dde连接,dword idinst = 0; //定义dde实例标识的变量ddeiniTIalize(&idinst,(pfncallback)ddecallback,appclass_standard | appcmd_clientonly,0);这里将ddecallback函数指定为dde的回调函数。实例初始化后得到实例的标识idinst,之后的操作都要使用这个标识。

(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用于存储通过以太网发送到板型仪的数据,下文中将详细介绍。

上面介绍的方法用于从dde服务器中获取mb+网上的数据,那么如何将数据写入到mb+网呢,同样还是使用ddeml库中提供的方法,具体如下:

ddepoke(idinst,hconv4,szwidth,text(“1020”));

//写数据到mb+,设置宽度为1020mm

ddepoke为自定义函数,具体实现为:

void ddepoke(dword idinst, hconv hconv, tchar* szitem, tchar*

szdata)

{

hsz hszitem=ddecreatestringhandlew(idinst,szitem,cp_winunicode);

ddeclienttransaction((lpbyte)unicodetoansi(szdata),(dword)(lstrlenw(szdata)+1),hconv,

hszitem,cf_text,xtyp_poke,3000,null);

ddefreestringhandle(idinst,hszitem);

}

(3) 与以太网交换数据,这里使用的是socket协议。前面提到了缓冲区ptele1101,这里存储的是要传送到板型仪的数据。这是一个结构指针,定义如下:

typedef struct

{

teleheader msgheader; //消息头

tele1101block1 msgblock1; //消息第一部分

tele1101block2 msgblock2; //消息第二部分

tele1101block3 msgblock3; //消息第三部分

} tele1101, *ptele1101;

ptele1101 ptele1101;

这其中teleheader、tele1101block1、tele1101block2和tele1101block3也分别是一个结构,这里就不详述了。

本实例中使用另外一个线程来处理以太网的数据交换,这样不会中断处理dde数据的过程。

dword dwthreadid;

thread=createthread(null,0,(lpthread_start_routine )

sockthread,null,0,&dwthreadid);

sockthread为线程的过程函数,具体实现如下:

void sockthread()

{

int i=0;

tchar buf[256];

initwinsock();//初始化socket

//创建并设置协议类型,地址和端口

socket socksrv=socket(af_inet,sock_stream,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(5001);

//绑定并监听端口

bind(socksrv,(sockaddr*)&addrsrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in addrclient;

int len=sizeof(sockaddr);

while (1) //程序正常运行时,始终接收连接请求

{

sockconn=accept(socksrv,(sockaddr*)&addrclient,&len);

zeromemory(buf,sizeof(buf));

__try

{

while (1) //连接建立后每50秒交换一次数据

{

len=send(sockconn,(char *)ptele1101,sizeof(tele1101),0);

len=recv(sockconn,(char *)ptele1102,sizeof(tele1102),0);

if (0==len || socket_error==len)

{

len=wsagetlasterror();

raiseexception(1,0,0,null);

}

sleep(50);

}

}

__except(exception_execute_handler)

{

closesocket(sockconn);

}

}

closesocket(socksrv);

wsacleanup();

}

这里ptele1102为接收数据的缓冲区,也是一个结构,定义与ptele1101类似,此处不详述。

从mb+网来的数据在使用dde协议获取后存入缓冲区ptele1101,发送到板型仪,从板型仪来的数据存入缓冲区ptele1102,相关数据再使用dde协议写回到mb+网,这样就实现了mb+网和以太网的数据交换。

4、结束语

本文介绍的数据交换的方法编程实现起来比较容易,代码量较少,能很好的解决异种网络间的数据交换的需求,并在单机架平整机板型控制系统中得到了成功的应用,取得了满意的效果。文中介绍的使用dde协议和socket协议处理数据的方式有较好的通用性,经过简单修改既可以用于其他的系统。另外通过简单的扩展,即可实现数据采集和分析的功能。可以广泛应用于工业控制的各个领域。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

利用10Base-T1L SPE取代传统的4mA-20mA和现场总线实现IIoT网络

关键字: IIoT网络 传感器 以太网

为增进大家对工业以太网的认识,本文将对工业以太网的原理、工业以太网的关键技术以及工业以太网要解决的问题予以介绍。

关键字: 以太网 工业以太网 指数

为增进大家对工业以太网的认识,本文将对工业以太网网络优势、工业以太网和IOLINK的区别予以介绍。

关键字: 以太网 工业以太网 指数

新品播报!米尔电子发布了基于海思Hi3093高性能MPU的MYC-LHi3093核心板及开发板, 此款核心板支持openEuler embedded OS欧拉系统,丰富生态,可实现100%全国产自主可控。不仅如此,米尔基...

关键字: 核心板 PLC 开发板

新的IEEE汽车以太网标准不断涌现,10BASE-T1S是最新的以太网标准之一。本文讨论汽车行业影响汽车电子/电气(E/E)架构变化的发展趋势,以及新10BASE-T1S标准如何支持和推动这种新架构的部署。

关键字: 以太网 汽车电子 传感器

在现代工业自动化领域,可编程逻辑控制器(PLC)扮演着至关重要的角色。作为工业控制系统的核心,PLC负责处理各种输入信号,执行逻辑运算,并输出控制信号以驱动执行机构,从而实现自动化生产流程的控制。而PLC的稳定运行离不开...

关键字: 可编程逻辑控制器 工业控制 PLC

该解决方案采用全新 1.6T 以太网控制器 IP、经过硅验证的224G PHY IP和验证IP,助力未来基础设施的升级建设

关键字: 数据中心 芯片 以太网

模拟与混合信号事业部将提供行业领先的技术为汽车、工业和云端市场提供全面的系统解决方案

关键字: 电源管理 传感器 以太网

单片机和PLC将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对二者的相关情况以及信息有所认识和了解,详细内容如下。

关键字: PLC 单片机

为增进大家对工控机的认识,本文将对工控机的主要分类、工控机的应用领域予以介绍。

关键字: 工控机 指数 PLC
关闭
关闭