发表于:2009/5/6 12:14:08
#0楼
摘要:分析了EtherNet/IP协议、CIP协议对象模型,根据实际数据分析了报文封装,给出了Linux下Socket编程方法和EtherNet/IP协议的实现方法。
关键词: EtherNet/IP CIP TCP/IP 套接口编程
1引 言
Linux作为一款稳定的、源代码开放的、免费的类Unix操作系统,已广泛应用到工业控制领域。与Win-dows操作系统相比,Linux操作系统具有很多明显的优势:性能更加稳定、系统更加安全;采用模块化的内核体系,具有可定制性、可配置性,可方便的裁剪;源代码完全开放,有着更成熟、更友好的编程接口;成本低廉。由于Linux内核的极大的可裁剪性、可配置性,在嵌入式系统中也取得了越来越广泛的应用,提高了系统的可靠性并降低了系统的成本。文中给出了在Linux下EtherNet/IP协议的实现方法。本程序也可方便的移植到嵌入式系统中,作为EtherNet/IP网络上的一个智能节点。
2 Linux下Socket编程
套接口Socket是开发TCP/IP网络应用程序的API,它定义了很多函数和例程,提供了访问TCP、UDP等协议的接口。应用程序只需通过这些接口就可通过TCP/IP协议发送接收数据,而无需了解其协议细节。套接口是面向客户端/服务器(C/S)模型设计的。为了实现通过TCP或UDP协议传输数据,需要在客户端和服务器端执行不同的函数调用。
图1为采用TCP协议通讯时的函数调用模型,数据通讯前要先建立连接。服务器端要先用Socket()函数调用创建一个TCP套接字,函数Bind()将本地地址接字地址绑定在一起,并可指定服务器的端口号和接受的客户端的IP地址范围。函数Listen()将套接字转化为倾听套接字。Accept()返回一个新的套接字与客户端通信。当客户端通过Connect()和服务器建立连接后就可以通过Read()和Write()传送数据。通讯完毕通过Close()关闭套接字。EtherNet/IP协议采用TCP传送显性报文。图2为采用UDP协议通讯时的函数调用模型,此时不需建立连接。对方地址通过在Sendto( )和Recvfrom( )函数中指定。EtherNet/IP协议采用UDP传送隐性报文。
图1 TCP协议的Socket编程模型
图2 UDP协议的Socket编程模型
3 EtherNet/IP协议体系结构
EtherNet/IP协议的体系结构如图3所示。应用层采用CIP协议,其底层完全采用了现有以太网的传输层、网络层、数据链路层、物理层,未作任何修改。因此,应用Linux的Socket编程接口,实现EtherNet/IP协议主要就是实现应用层的CIP协议。EtherNet/IP协议不仅支持点对点的通讯模式,还支持生产者/消费者通讯模式,这种一对一个或多个的通讯模式是通过IP多播的技术实现的。值得提出的是, EtherNet/IP、ControlNet、De-viceNet网络的应用层都是CIP协议,只是它们基于的物理层、数据链路层不同,实现了一种网络的CIP协议,略加修改就可以应用到其余两种网络上。这使得CIP协议有着更好的通用性,也使得CIP设备之间有更好的交互性。
图3 EtherNet/IP协议体系结构图
4 CIP协议模型
CIP协议提供了基于连接的数据通讯机制。CIP连接可以动态的建立。CIP连接可分为I/O连接(隐性报文连接)和显性报文连接。I/O连接为一个生产者和一个或多个消费者提供了专用的通讯路径。显性报文连接提供了典型的面向请求/应答的网络通讯,一般用来上载下载程序、设备信息、组态信息等。CIP协议的I/O连接模型如图4所示。CIP协议的显性报文连接模型如图5所示。数据通讯都要通过专门的连接对象进行。
图4 CIP协议I/O连接模型
图5 CIP协议显性报文连接模型
CIP协议用面向对象语言描述。CIP协议对象模型如图6所示。未连接报文管理器(UCMM)的主要作用是建立I/O连接和显性连接。当一设备要与网络上另一设备建立连接时,先给对方设备的UCMM发送连接请求,对方设备若答应请求则创建、初始化连接对象,并向请求设备的UCMM返回响应信息。然后原来发出请求的设备创建、初始化自己的连接对象。连接完成之后,就可以通过连接对象传送显性报I/O报文。报文路由的主要作用是对报文打包、解包,将连接对象接收过来的报文解包,分发给各个对象。然后将各对象返回的数据打包,交给连接对象发送。
CIP设备中的对象分为3类:通用对象、应用对象和网络特定对象。通用对象有连接对象、报文路由对象、身份对象等。身份对象中存有设备型号、名称等信息。网络特定对象有TCP/IP接口对象、ControlNet接口对象和DeviceNet接口对象,分别存有和EtherNet/IP、ControlNet、DeviceNet特定网络相关的信息。应用对象是和具体应用、具体设备相关的对象,比如有AC/DC变频器,离散量、模拟量I/O等。
图6 CIP协议抽象对象模型
以离散量I/O的设备为例,需要实现的类有:身份类、报文路由类、连接类、连接管理类、TCP/IP接口类、Ethernet连接类、离散量I/O点类、离散量输入组/输出组类、汇编类。此外还要实现未连接报文管理器UCMM,虽然UCMM不是一个类,但是它是每一个设备所必需的。
5 EtherNet/IP协议数据封装格式
图7为EtherNet/IP协议的报文封装示意图。CIP协议报文经封装之后,在通讯时又逐层被封装上了TCP、IP、Ethernet报头。
图7 EtherNet/IP协议的报文封装
CIP报文封装的格式如表1所示。下面以向对方的UCMM发送建立显性连接的请求报文为例说明CIP报文封装。其16进制表示的报文为:
6F003E00000002200000 00000000000000000000
00000000000000000004 020000000000B2002E00
5402200624010AF00000 000000000180ABCD0100
98765432070000004082 1F00FB4240821F00FB42
A30220022401
表1 CIP报文封装格式
分析报文时需要注意网络字节顺序和本机字节。网络字节顺序是从高位到低位,本机字节顺序是从低位到高位。前两字节为命令字Command,注意高位低位存放顺序,0x006F为发送RRData命令。数据长度为0x3E=62字节,CIP报文总长度为62+24(报文头长度)=86字节。Session ID=0x20020000。Status=0x00000000。Sender Context=0x00000000000000000。
Options=0x00000000。接下来为RRData命令相关数据。Interface Handle=0x00000000,Time out项为0x0400。Item Count=0x0002,表明下面有两项:地址项和数据项。地址项Addr Item ID=0x0000,Addr Len=0x0000。数据项Data Item=0x00B2,Data Len=0x2E=46。接下来为CIP Data的内容。将CIP报文正确封装好,通过Socket编程接口发送到网络上的其他节点,就可以实现与网络上其他节点的通讯。具体命令、类、属性、行为、服务的ID请参照EtherNet/IP Specification。
6 结束语
本文通过分析EtherNet/IP协议给出了EtherNet/ IP协议在Linux上的实现方法。虽然目前工业以太网所占工业现场控制的份额较小,但是由于以太网已经取得的任何其他现场总线都不可比拟的商业应用,以及以太网技术的日益成熟、稳定、高速,工业以太网在未来的现场总线领域也一定会有所作为甚至“一网到底”。
参考文献
[1> 张斌,高波等.Linux下网络编程.北京:清华大学出版社,2000
[2> ODVA/CI. EtherNet/IP specifications [M>, Release1.0. 2001.
[3> 吴爱国,李长滨.工业以太网协议EtherNet/I P.计算机应用.2003,23(11):9~11.
关键词: EtherNet/IP CIP TCP/IP 套接口编程
1引 言
Linux作为一款稳定的、源代码开放的、免费的类Unix操作系统,已广泛应用到工业控制领域。与Win-dows操作系统相比,Linux操作系统具有很多明显的优势:性能更加稳定、系统更加安全;采用模块化的内核体系,具有可定制性、可配置性,可方便的裁剪;源代码完全开放,有着更成熟、更友好的编程接口;成本低廉。由于Linux内核的极大的可裁剪性、可配置性,在嵌入式系统中也取得了越来越广泛的应用,提高了系统的可靠性并降低了系统的成本。文中给出了在Linux下EtherNet/IP协议的实现方法。本程序也可方便的移植到嵌入式系统中,作为EtherNet/IP网络上的一个智能节点。
2 Linux下Socket编程
套接口Socket是开发TCP/IP网络应用程序的API,它定义了很多函数和例程,提供了访问TCP、UDP等协议的接口。应用程序只需通过这些接口就可通过TCP/IP协议发送接收数据,而无需了解其协议细节。套接口是面向客户端/服务器(C/S)模型设计的。为了实现通过TCP或UDP协议传输数据,需要在客户端和服务器端执行不同的函数调用。
图1为采用TCP协议通讯时的函数调用模型,数据通讯前要先建立连接。服务器端要先用Socket()函数调用创建一个TCP套接字,函数Bind()将本地地址接字地址绑定在一起,并可指定服务器的端口号和接受的客户端的IP地址范围。函数Listen()将套接字转化为倾听套接字。Accept()返回一个新的套接字与客户端通信。当客户端通过Connect()和服务器建立连接后就可以通过Read()和Write()传送数据。通讯完毕通过Close()关闭套接字。EtherNet/IP协议采用TCP传送显性报文。图2为采用UDP协议通讯时的函数调用模型,此时不需建立连接。对方地址通过在Sendto( )和Recvfrom( )函数中指定。EtherNet/IP协议采用UDP传送隐性报文。
图1 TCP协议的Socket编程模型
图2 UDP协议的Socket编程模型
3 EtherNet/IP协议体系结构
EtherNet/IP协议的体系结构如图3所示。应用层采用CIP协议,其底层完全采用了现有以太网的传输层、网络层、数据链路层、物理层,未作任何修改。因此,应用Linux的Socket编程接口,实现EtherNet/IP协议主要就是实现应用层的CIP协议。EtherNet/IP协议不仅支持点对点的通讯模式,还支持生产者/消费者通讯模式,这种一对一个或多个的通讯模式是通过IP多播的技术实现的。值得提出的是, EtherNet/IP、ControlNet、De-viceNet网络的应用层都是CIP协议,只是它们基于的物理层、数据链路层不同,实现了一种网络的CIP协议,略加修改就可以应用到其余两种网络上。这使得CIP协议有着更好的通用性,也使得CIP设备之间有更好的交互性。
图3 EtherNet/IP协议体系结构图
4 CIP协议模型
CIP协议提供了基于连接的数据通讯机制。CIP连接可以动态的建立。CIP连接可分为I/O连接(隐性报文连接)和显性报文连接。I/O连接为一个生产者和一个或多个消费者提供了专用的通讯路径。显性报文连接提供了典型的面向请求/应答的网络通讯,一般用来上载下载程序、设备信息、组态信息等。CIP协议的I/O连接模型如图4所示。CIP协议的显性报文连接模型如图5所示。数据通讯都要通过专门的连接对象进行。
图4 CIP协议I/O连接模型
图5 CIP协议显性报文连接模型
CIP协议用面向对象语言描述。CIP协议对象模型如图6所示。未连接报文管理器(UCMM)的主要作用是建立I/O连接和显性连接。当一设备要与网络上另一设备建立连接时,先给对方设备的UCMM发送连接请求,对方设备若答应请求则创建、初始化连接对象,并向请求设备的UCMM返回响应信息。然后原来发出请求的设备创建、初始化自己的连接对象。连接完成之后,就可以通过连接对象传送显性报I/O报文。报文路由的主要作用是对报文打包、解包,将连接对象接收过来的报文解包,分发给各个对象。然后将各对象返回的数据打包,交给连接对象发送。
CIP设备中的对象分为3类:通用对象、应用对象和网络特定对象。通用对象有连接对象、报文路由对象、身份对象等。身份对象中存有设备型号、名称等信息。网络特定对象有TCP/IP接口对象、ControlNet接口对象和DeviceNet接口对象,分别存有和EtherNet/IP、ControlNet、DeviceNet特定网络相关的信息。应用对象是和具体应用、具体设备相关的对象,比如有AC/DC变频器,离散量、模拟量I/O等。
图6 CIP协议抽象对象模型
以离散量I/O的设备为例,需要实现的类有:身份类、报文路由类、连接类、连接管理类、TCP/IP接口类、Ethernet连接类、离散量I/O点类、离散量输入组/输出组类、汇编类。此外还要实现未连接报文管理器UCMM,虽然UCMM不是一个类,但是它是每一个设备所必需的。
5 EtherNet/IP协议数据封装格式
图7为EtherNet/IP协议的报文封装示意图。CIP协议报文经封装之后,在通讯时又逐层被封装上了TCP、IP、Ethernet报头。
图7 EtherNet/IP协议的报文封装
CIP报文封装的格式如表1所示。下面以向对方的UCMM发送建立显性连接的请求报文为例说明CIP报文封装。其16进制表示的报文为:
6F003E00000002200000 00000000000000000000
00000000000000000004 020000000000B2002E00
5402200624010AF00000 000000000180ABCD0100
98765432070000004082 1F00FB4240821F00FB42
A30220022401
表1 CIP报文封装格式
分析报文时需要注意网络字节顺序和本机字节。网络字节顺序是从高位到低位,本机字节顺序是从低位到高位。前两字节为命令字Command,注意高位低位存放顺序,0x006F为发送RRData命令。数据长度为0x3E=62字节,CIP报文总长度为62+24(报文头长度)=86字节。Session ID=0x20020000。Status=0x00000000。Sender Context=0x00000000000000000。
Options=0x00000000。接下来为RRData命令相关数据。Interface Handle=0x00000000,Time out项为0x0400。Item Count=0x0002,表明下面有两项:地址项和数据项。地址项Addr Item ID=0x0000,Addr Len=0x0000。数据项Data Item=0x00B2,Data Len=0x2E=46。接下来为CIP Data的内容。将CIP报文正确封装好,通过Socket编程接口发送到网络上的其他节点,就可以实现与网络上其他节点的通讯。具体命令、类、属性、行为、服务的ID请参照EtherNet/IP Specification。
6 结束语
本文通过分析EtherNet/IP协议给出了EtherNet/ IP协议在Linux上的实现方法。虽然目前工业以太网所占工业现场控制的份额较小,但是由于以太网已经取得的任何其他现场总线都不可比拟的商业应用,以及以太网技术的日益成熟、稳定、高速,工业以太网在未来的现场总线领域也一定会有所作为甚至“一网到底”。
参考文献
[1> 张斌,高波等.Linux下网络编程.北京:清华大学出版社,2000
[2> ODVA/CI. EtherNet/IP specifications [M>, Release1.0. 2001.
[3> 吴爱国,李长滨.工业以太网协议EtherNet/I P.计算机应用.2003,23(11):9~11.