CIP (Common Industrial Protocol, 通用工业协议) 是由 ODVA 提出并维护的协议。CIP 适配 EhterNet/IP, DeviceNet, CompoNet 以及 ControlNet 等网络。这里仅叙述了基于EtherNet/IP 的 CIP 协议重点。
EtherNet/IP 是基于标准以太网协议(IEEE 802.3)的技术,支持 TCP 与 UDP 传输协议,支持数种网络拓扑连接方式。
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节点(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协议簇包含了许多常用对象,大致可分为三类:一般用途,特定应用,特定网络。
对于一般用途如下表:
该对象包含了设备的基础身份信息,其主要属性包括: 产商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用于申明该项值的长度。
4. 封装数据的使用
4.1 显性信息传输 (explicit Messaging)
显性传输分为 已连接与未连接传输。其区别在于,建立了连接之后,设备会保留管理连接所需要的资源,可以提高设备响应效率。隐藏未连接的显性传输通常仅在应用程序要求不规则且不频繁的情况下使用。
下图为WireShark 实例
在下图中,CIP 协议由服务请求,请求对象类型,对象实例构成,最后是请求的数据,这里Wireshark自动识别出了数据格式符合CIP connection manager的格式。在其它环境下,数据值可能是厂家自行设定的,Wireshark不一定能识别出来,就会显示一串十六进制值。
4.2 隐性信息传输 (implicit / I/O Messaging)
I/O 信息基于UDP/IP 发送,强调高实时性,该传输方式不需要封装头部,其格式如下所示。
下图时WireShark 实例,请对照上图。
其中CIP Sequence Count,在一般情况不影响设备的交流,该项是用于CIP Safety 使用的。
上述为常规的CIP协议,初此之外还有CIP Safety, CIP security, CIP Sync 和CIP Motion等协议。
CIP Safety用于检测CIP网络是否出现网络错误,用于报警提示,提供密码机制限制用户配置设备。
CIP Security使用TLS加密协议来传输数据。
CIP Sync的一个典型应用是时间戳传感器输入,分布式时间触发输出和分布式运动。(没有深入了解过)
CIP Motion是一个专门针对电机驱动的协议,该协议提供了几种不同的电机控制方式(回头单开一章)。
原文链接:https://blog.csdn.net/weixin_43988842/article/details/113822291