EtherNet/IP 是基于标准以太网协议(IEEE 802.3)的技术,支持 TCP 与 UDP 传输协议,支持数种网络拓扑连接方式。
EtherNet/IP 定义了两种类型的通讯方式,显性(explicit)与隐形(implicit)。
CIP 消息类型 | CIP 通讯关系 | 传输协议 | 通讯类型 | 适用情形 | 举例 |
---|---|---|---|---|---|
显性 | 已连接或未连接 | TCP/IP | 请求/响应 交换 | 低时间相关性数据信息 | 读/写,配置字段 |
隐形 | 已连接 | UDP/IP | I/O 数据交换 | 实时 I/O 数据 | 实时控制数据 |
显性通信: 通过TCP传输数据,适合用于传递高准确性,低及时性的数据,例如配置设备信息,上传或下载程序。表格中CIP通讯关系中的 已连接与未连接 是CIP 协议的一个服务,完成该服务后,连接的双方各持一串号码,用该号码来完成后续的信息交流。
隐形通信: 通过UDP传输数据,适合用来传输高实时性的数据,例如马达控制,传感器数据。该通信方式需要提前建立CIP连接(详见后续)。
CIP 连接需要通过 Connection Manager(CM) 对象的ForwardOpen 服务来完成。客户端作为请求的发起方,请求中包含传输类,时间信息,电子密钥以及连接ID。当接收到ForwardClose请求或响应超时,清空连接信息。
对于隐形通信,其数据可以广播或发送给某特定地址。数据的发送必须包含对象的IP(单一IP或广播地址)以及 CIP 连接 ID。
ODVA 提供了七卷关于CIP网络库的指南,需要成为会员才能获取。
卷一:描述了CIP的通用对象库,设备信息库。
卷二:描述CIP与EtherNet/IP如何适配。
卷三:描述CIP与DeviceNet如何适配。
卷四:描述CIP与ControlNet如何适配。
卷五:描述CIP安全协议, CIP Safety Protocol。
卷六:描述CIP与CompoNet如何适配。
卷七:描述如何将 Modbus 设备接入 CIP 网络。
其总体格式如下:
CIP | 包含命令,具体执行对象信息 |
---|---|
EtherNet/IP | 包含通信对象,连接信息 |
TCP or UDP | 通信端口信息 |
IP | 双方IP地址信息 |
Ethernet | 双方物理地址信息 |
每个CIP节点(node)都是一组对象(object)的集合。每个对象都代表了设备的某个特定组件,所有未被描述的对象,都无法通过CIP访问(没有定义当然没法访问)。CIP对象由 类(class),实例(instance),属性(attribute)构成。每个类可以有多个实例,每个实例可以有多个属性。(举例:一个类叫做 男人。这个 男人 类可以有实例 王二狗,李铁柱。王二狗 可以包含属性年龄,身高,体重。在读取或写入的数据的时候,协议中就要申明要操作的是哪个类的哪个实例的哪个属性。)
类(class)是一组代表相同系统组件的对象。实例(instance)是该类中的某个特定对象。每个实例可以有自己特有的属性。
CIP 网络中的每个节点都有节点地址,在EtherNet/IP 网络中,该地址即为设备的IP地址。
CIP中每个类,实例,属性都有其对应的ID (Class ID, Instance ID, Attribute ID)。
CIP中使用服务代码来明确操作指令。
类ID分为两个部分,公共对象(范围:0x0000–0x0063, 0x00F0–0x02FF),厂家自定义对象(范围:0x0064–0x00C7, 0X0300-0X04FF)。其它范围为预留部分。
实例ID也分为两个部分,公共实例(范围:0x0001–0x0063,0x00C8-0x02FF),厂家自定义实例(范围:0x0064-0xxC7,0x0300-0x04FF)。其它范围为预留部分。
属性ID,公共属性(范围:0x0000–0x0063,0x0100–0x02FF,0x0500–0x08FF),厂家自定义属性(范围:0x0064–0x00C7,0x0300–0x04FF,0x000–0x0CFF)。
CIP 服务代码用来明确请求的操作指令,上述提到的 Forward Open就是一个服务,其它包括常规的读/写服务,创建实例服务。CIP服务代码同样分为公共服务以及厂家自定义服务。
CIP协议簇包含了许多常用对象,大致可分为三类:一般用途,特定应用,特定网络。
对于一般用途如下表:
名称 | 代码 | 名称 | 代码 |
---|---|---|---|
Assembly | 0x04 | Message Router | 0x02 |
Acknowledge Handler | 0x2B | Originator Connection List | 0x45 |
Connection | 0x05) | Parameter | 0x0F |
Connection Configuration | 0xF3 | Parameter Group | 0x10 |
Connection Manager | 0x06 | Port | 0xF4 |
File | 0x37 | Register | 0x07 |
Identity | 0x01 | Selection | 0x2E |
对于特定应用:
名称 | 代码 | 名称 | 代码 |
---|---|---|---|
AC/DC Drive | 0x2A | Analog Group | 0x22 |
Analog Input Group | 0x20 | Analog Input Point | 0x0A |
Analog Output Group | 0x21 | Analog Output Point | 0x0B |
Base Energy | 0x4E | Block Sequencer | 0x26 |
Command Block | 0x27 | Control Supervisor | 0x29 |
Discrete Group | 0x1F | Discrete Input Group | 0x1D |
Discrete Output Group | 0x1E | Discrete Input Point | 0x08 |
Discrete Output Point | 0x09 | Electrical Energy | 0x4F |
Event Log | 0x41 | Group | 0x12 |
Motion Device Axis | 0x42 | Motor Data | 0x28 |
Non-Electrical Energy | 0x50 | Overload | 0x2C |
Position Controller | 0x25 | Position Controller Supervisor | 0x24 |
Position Sensor | 0x23 | Power Curtailment Object | 0x5C |
Power Management Object | 0x53 | Presence Sensing | 0x0E |
S-Analog Actuator | 0x32 | S-Analog Sensor | 0x31 |
S-Device Supervisor | 0x30 | S-Gas Calibration | 0x34 |
S-Partial Pressure | 0x38 | S-Sensor Calibration | 0x40 |
S-Single Stage Controller | 0x33 | Safety Analog Input Group | 0x4A |
Safety Analog Input Point | 0x49 | Safety Dual Channel Feedback Object | 0x59 |
Safety Feedback Object | 0x5A | Safety Discrete Input Group | 0x3E |
Safety Discrete Input Point | 0x3D | Safety Discrete Output Group | 0x3C |
Safety Discrete Output Point | 0x3B | Safety Dual Channel Analog Input | 0x4B |
Safety Dual Channel Output | 0x3F | Safety Limit Functions Object | 0x5B |
Safety Stop Functions Object | 0x5A | Safety Supervisor | 0x39 |
Safety Validator | 0x3A | Softstart | 0x2D |
Target Connection List | 0x4D | Time Sync | 0x43 |
Trip Point | 0x35 |
对于特定网络:
名称 | 代码 | 名称 | 代码 |
---|---|---|---|
Base Switch | 0x51 | CompoNet Link | 0xF7 |
CompoNet Repeater | 0xF8 | ControlNet | 0xF0 |
ControlNet Keeper | 0xF1 | ControlNet Scheduling | 0xF2 |
Device Level Ring | DLR | 0x47 | DeviceNet |
Ethernet Link | 0xF6 | Modbus | 0x44 |
Modbus Serial Link | 0x46 | Parallel Redundancy Protocol | 0x56 |
Power Management | 0x53 | PRP Nodes Table | 0x57 |
SERCOS III Link | 0x4C | SNMP | 0x52 |
QoS | 0x48 | RSTP Bridge | 0x54 |
RSTP Port | 0x55 | TCP/IP Interface | 0xF5 |
该对象包含了设备的基础身份信息,其主要属性包括: 产商ID, 设备类型,产品码,修订版本,当前状态,序列码,产品名。可选或条件属性包括:状态,配置一致性,活动间隔,当前语言,支持语言列表,国际产品名,信号量,指定名称,指定描述,地理位置,Modbus身份信息,保护模式。
该对象包含两类:完整对象以及缩写版本。缩写版本主要用于仅有有限内存的DeviceNet以及CompoNet设备。
该对象的设计目的是提供一种不需要工具即可允许访问其它诸多对象的方法。
该对象的属性包含当前设备存在的实例总数,类描述。
该对象提供了将来自不同类的不同实列的属性映射进集成对象的单一属性的选项。这样可以优化I/O消息交换的效率。(减少请求以及信息传递)
下图为EtherNet/IP的一般结构,EtherNet/IP 为 传输层中的内容。EtherNet/IP 可分为两个部分:封装头部,以及封装数据。CIP指令包含于封装数据中。
下图为EtherNet/IP的头部格式,其中包括指令,长度信息,会话句柄,状态,等
设备发现 (ListIdentity Command),该指令通过UDP 广播发送给所有网络中的设备,接收到消息并且支持EtherNet/IP的设备会返回自身的身份信息。
注册会话 (RegisterSession/UnRegisterSession Commands),该指令用于注册或注销会话。会话注册之后,设备才能够进行数据交换,两台设备之间同时存在一组会话。发起请求后,服务器会返回一个Session Handle,后续交流需要使用该Session Handle 的值方可交流。
SendRRData/SendUnitData Commands,SendRRData 用于发送未建立CIP连接的显性数据,SendUnitData用于发送连接了的显性数据。发送RRdata时需要使用Sender Context,发送UnitData时则不需要。
一般都是两个Item,一个地址项,一个数据项,随后是具体CIP命令。每个项的前2bytes用于申明该项的类型,后2bytes用于申明该项值的长度。
显性传输分为 已连接与未连接传输。其区别在于,建立了连接之后,设备会保留管理连接所需要的资源,可以提高设备响应效率。隐藏未连接的显性传输通常仅在应用程序要求不规则且不频繁的情况下使用。
下图为WireShark 实例
在下图中,CIP 协议由服务请求,请求对象类型,对象实例构成,最后是请求的数据,这里Wireshark自动识别出了数据格式符合CIP connection manager的格式。在其它环境下,数据值可能是厂家自行设定的,Wireshark不一定能识别出来,就会显示一串十六进制值。
I/O 信息基于UDP/IP 发送,强调高实时性,该传输方式不需要封装头部,其格式如下所示。
下图时WireShark 实例,请对照上图。
其中CIP Sequence Count,在一般情况不影响设备的交流,该项是用于CIP Safety 使用的。