1、引言

工业以太网协议 (Ethernet/IP) 是由ODVA所开发并得到了罗克韦尔自动化的强大支持。它使用已用于ControlNet和DeviceNet的控制和信息协议 (CIP) 为应用层协议。

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_python 欧姆龙PLC端口通讯

CIP提供了一系列标准的服务,提供“隐式”和“显示”方式对网络设备中的数据进行访问和控制。CIP数据包必须在通过以太网发送前经过封装,并根据请求服务类型而赋予一个报文头。这个报文头指示了发送数据到响应服务的重要性。通过以太网传输的CIP数据包具有特殊的以太网报文头,一个IP头、一个TCP头和封装头。封装头包括了控制命令、格式和状态信息、同步信息等。这允许CIP数据包通过TCP或UDP传输并能够由接收方解包。相对于DeviceNet或ControlNet,这种封装的缺点是协议的效率比较低。以太网的报文头可能比数据本身还要长,从而造成网络负担过重。因此,EtherNet/IP更适用于发送大块的数据 ( 如程序 ) ,而不是DeviceNet和ControlNet更擅长的模拟或数字的I/O数据。

EtherNet/IP指的是"以太网工业协议"(Ethernet Industrial Protocol)。它定义了一个开放的工业标准,将传统的以太网与工业协议相结合。该标准是由国际控制网络(CI, ControlNet International)和开放设备网络供应商协会 (ODVA)在工业以太网协会 (IEA, Industrial Ethernet Association)的协助下联合开发的,并于2000年3月推出。EtherNet/IP是基于TCP/IP系列协议,因此采用以原有的形式OSI层模型中较低的4层。所有标准的以太网通信模块,如PC接口卡、电缆、连接器、集线器和开关都能与 EtherNet/IP 一起使用。

 

2、 EtherNet/IP_报文格式

    注册请求帧:EtherNet/IP与Fins类似,在正式通信前需要进行注册请求,获取到会话句柄。

注册请求帧报文格式如下:

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_IP_02

因此,一个完整的注册请求帧发送实例:

65 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

    注册应答帧:顾名思义,注册应答帧就是注册请求帧的应答报文,包含了我们需要的会话句柄。

注册应答帧报文格式如下:

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_03

 

 

 

注册请求帧接收实例:

65 00 04 00 71 01 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

根据应答报文,提取会话句柄为:0x71 0x01 0x0E 0x00

其中状态相当于错误代码,如下所示:

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_04

    读取信息报文帧 EtherNet/IP

PLC标签:TAG1

读取报文:

封装头:6F 00 28 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 18 00 52 02 20 06 24 01 0A F0 0A 00 4C 03 91 04 54 41 47 31 01 00 01 00 01 00

报文解析:

6F 00  命令码

28 00  后面数据报文长度

70 01 27 00  会话句柄

00 00 00 00  状态,默认值0

00 00 00 00 00 00 00 00 发送方描述

00 00 00 00  选项默认

00 00 00 00  接口句柄 00 00 00 00 代表CIP

01 00  超时

02 00  项数

00 00  空地址项

00 00  空地址项长度

B2 00  未连接项 默认

18 00  CIP报文包的长度

52  命令

02  请求路径长度

20 06 24 01  默认请求路径

0A F0 0A 00  默认超时

4C  服务标识

03  CIP长度多少字

91  固定

04  PLC标签长度 多少个字节

01 00  读取长度

01 00 01 00  槽号

    返回信息报文帧 EtherNet/IP

返回报文:

封装头:6F 00 18 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 08 00 CC 00 00 00 C1 00 00 00

报文解析:

6F 00 命令

18 00 长度 (总长度 -封装头长度 )

71 01 14 00 会话句柄(会话ID)

00 00 00 00 会话状态

00 00 00 00 00 00 00 00 发送方描述 固定

00 00 00 00 选项 默认

00 00 00 00 接口句柄 ,00000000 指CIP

01 00 超时

02 00 项数 默认2

00 00 连接的地址项

00 00 连接地址项长度

B2 00 未连接数据项

08 00 连接长度

CC 服务标识

00 填充字节

00 00 状态

C1 00 数据类型 BOOL  (0x00C3(195) 为整型,0x00CA(202)为实型, 0x00C1(193)为布尔型,long 型为0x00C4,BYTE为0x00C2 )

00 00 数据值

    写入信息报文帧 EtherNet/IP

PLC标签:TAG1

写入报文:

封装头:6F 00 2C 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1C 00 52 02 20 06 24 01 0A F0 0E 00 4D 03 91 04 54

41 47 31 C1 00 01 00 00 00 01 00 01 00

解析报文:

6F 00  命令码

2C 00  长度(去除header后报文长度 字节为单位)

71 01 14 00  会话句柄

00 00 00 00  会话状态

00 00 00 00 00 00 00 00  发送方描述 固定

00 00 00 00  选项 默认

00 00 00 00  接口句柄 ( 00 00 00 00 指CIP)

01 00  超时

02 00  项数 默认2

00 00  空地址项 默认

00 00  空地址项长度 默认

B2 00  未连接数据项 默认

1C 00  数据长度 指后面数据长度 (字节)

52  请求服务代码

02  请求路径长度

20 06 24 01 请求路径 默认

0A F0  超时默认 245760ms

OE 00  长度(从服务标识开始 到 写入的值 结束 )

4D  服务标识

03  长度(91 04 54 41 47 31 )

91  固定

04  标签长度

54 41 47 31  TAG1(标签名)

C1 00  数据类型 bool0x00C3(195) 为整型,0x00CA(202)为实型,0x00C1(193)为布尔型,long 型为0x00C4,BYTE为0x00C2

01 00  写入数量

00 00  写入的值 false:0  TRUE:任意非0数

01 00 01 00  PLC槽号

返回报文:

封装头:6F 00 14 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

命令数据:00  00 00 00  01 00 02 00 00 00 00 00 B2 00 04 00 cd 00 00 00

解析报文:

71 01 14 00  会话句柄

B2 00  未连接数据项 默认

CD  服务标识(写)固定

00  填充字节

0000  状态:成功

    多标签读取

参考单标签的报文帧,读取TAG1 和TAG2

54 41 47 31 TAG1

54 41 47 32 TAG2

发送报文:

6F 00 3E 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 2E 00 52 02 20 06 24 01 0A F0 20 00 0A 02 20 02 24 01 02 00 06 00 10 00 4C 03 91 04 54 41 47 31 01 00 4C 03 91 04 54 41 47 32 01 00 01 00 01 00

返回报文:

6F 00 2A 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1A 00 8A 00 00 00 02 00 06 00 0E 00 CC 00 00 00 C1 00 01 00 CC 00 00 00 C1 00 01 00

    注销会话:注销会话顾名思义就是通信结束时发送,注销会话是没有返回值的。

注销会话报文:

66 00 00 00 71 01 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

报文解析:

66 00 :命令

00 00 :长度

71 01 04 00:要注销的会话句柄

00 00 00 00 状态 默认0

00 00 00 00 00 00 00 00:发送内容 默认0

00 00 00 00:选项 默认0

 

3、 EtherNet/IP通信应用

欧姆龙NX系列PLC不支持FinsTcp通信,但是支持FinsUdp通信,这个暂时不管,我们今天说的是 CipNet(Ethernet/IP)通信。

首先我们电脑连接NX1P2,使用欧姆龙编程软件Sysmac Studio连接PLC简单设置一

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_数据_05

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_python 欧姆龙PLC端口通讯_06

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_07

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_IP_08

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_09

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_数据_10

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_11

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_句柄_12

 PLC软件设置好后不要忘记,在线下载程序,到这里PLC准备好了。

 

然后开始C#上位机程序测试

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_python 欧姆龙PLC端口通讯_13

 

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_IP_14

 

 下面测试一下机构体变量

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_数据_15

 

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_IP_16

 

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_数据_17

 

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_IP_18

 

python 欧姆龙PLC端口通讯 欧姆龙plc网口通讯_数据_19