EtherNet
LinuxLinuxLinuxLinux 下 EtherNet
EtherNet IPIPIPIP 协议的实现
EtherNet
摘要:
Linux 作为一款稳定的、源代码开放的、免费的类 Unix 操作系统,已广
泛应用到工业控制领域。与Win-dows 操作系统相比,Linux 操作系统具有很多明
显的优势:性能更加稳定、系统更加安全;采用模块化的内核体系,具有可定制性、
可配置性,可方便的裁剪;源代码完全开放,有着更成熟、更友好的编程接口;成本
低廉。由于 Linux 内核的极大的可裁剪性、可配置性,在嵌入式系统中也取得了
越来越广泛的应用,提高了系统的可靠性并降低了系统的成本。文中给出了在
Linux 下 EtherNet/IP 协议的实现方法。本程序也可方便的移植到嵌入式系统中,
作为 EtherNet/IP 网络上的一个智能节点。
引 言
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 设备
之间有更好的交互性。
4 CIP 协议模型
图 3 EtherNet/IP 协议体系结构图
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 报头。
CIP 报文封装的格式如表 1 所示。下面以向对方的 UCMM 发送建立显性连
图 7 EtherNet/IP 协议的报文封装
接的请求报文为例说明 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 上的实现
方法。虽然目前工业以太网所占工业现场控制的份额较小,但是由于以太网已经
取得的任何其他现场总线都不可比拟的商业应用,以及以太网技术的日益成熟、
稳定、高速,工业以太网在未来的现场总线领域也一定会有所作为甚至“一网到
底”。