发布时间: 2026-01-30

Codesys与两台机器人进行EIP通讯


1. 简介

EtherNet/IP 是一种基于以太网技术的工业自动化网络协议,是以太网技术在工业领域的应用。它是由罗克韦尔自动化公司(Rockwell Automation)开发的,是一种开放的网络标准,可以用于连接各种各样的设备,如 PLC、传感器、执行器、HMI 等。

EtherNet/IP 协议基于 TCP/IP 协议栈,采用了面向连接和面向无连接的通信方式,可以实现高速的数据传输和实时的控制。它可以支持 10Mbps、100Mbps和 1000Mbps 三种传输速率,距离可以达到 100 米或更远。同时,EtherNet/IP还具有很强的灵活性和可扩展性,可以支持多种拓扑结构和协议适配器。

EtherNet/IP 协议的主要特点包括:

高速传输:EtherNet/IP 可以支持多种传输速率,可以满足不同应用场景的需求。

实时性强:EtherNet/IP 可以实现高速数据传输和实时控制。

灵活性强:EtherNet/IP 可以支持多种拓扑结构和协议适配器。

易于集成:EtherNet/IP 是一种开放的网络标准,可以与各种各样的设备集成使用。

可扩展性强:EtherNet/IP 可以通过加入新的协议适配器和功能模块来扩展网络功能。

安全性好:EtherNet/IP 支持多种安全机制,如 VLAN、VPN、IPsec 等

 

EC 系列产品支持以太网/IP 从站应用。 如果控制器作为从设备运行,则无需进行其他置。

在通信配置过程中可能使用的术语描述如下:

1.Originator: 向从站发起连接请求的一方,一般是主站或客户端设备。

2.Target:终端节点或者是从站设备,被请求建立连接的一方。

3.O->T:指示发起者到目标节点的方向,用于描述数据报由主站发送到从站。

4.T->O:指示从目标到发起者的方向,用于描述数据报由从站发送到主站。

5.RPI: Requested Packet Interval, 数据报的请求周期,单位为 ms。

6.Connection Timeout Multiplier: 其值表示的乘数与 RPI 相乘得到数据报传输的超时间,一般由主站设置。

7.point to point: 一种主从站的连接类型,点对点连接。

8.Multicast:一种主从站的连接类型, 由一个从站对多个主站传播。(目前暂不支持这种链接)。

9.EDS: Electronic Data Sheet,一种包含从站所有配置信息的文件,主站必须读取这个配置文件才能生成对从站的正确请求报文。

 

Ethernet/IP 部分寄存器被划分为11 个组(也称 slot),每个 slot 实质是一个 Ethernet/IP 连接,且都包含有 O->T与 T->O 两个方向的数据,其中只有一个方向上承载的数据为有效数据,而寄存器数据最终会在哪一个方向传输取决于寄存器的实际意义。如从控制器的视角,所有类型的输出寄存器会在T->O 方向传输,此时另一个方向 O->T存的意义可以认为是对 T->O 方向数据的确认;相对的,所有类型的输入寄存器会在 O->T 方向传输具体每个 slot 讲义如下(具体可参照 elite 通讯手册)

Adapter Slot 0: 32 个 32 位 int 输出寄存器,地址范围 [0,31] 传输方向 T->O(elite--codesys)

 

Adapter Slot 1: 32 个 32 位 int 输入寄存器,地 址范围 [0,31] 传输方向 O->T(codesys--elite)

 

Adapter Slot 2:寄存器类型 32 个 float 输 出寄存器,地址 范围 [0,31] 传输方向 T->O(elite--codesys)

 

Adapter Slot 3: 寄存器类型 32 个 float 输 入寄存器,地址 范围 [0,31] 传输方向 O->T(codesys--elite)

 

Adapter Slot 4 寄存器类型 52 个 float 输 入寄存器,地址 范围 [0,51]

 

主要包含机器人位置速度等信息

 

传输方向 T->O(elite--codesys)

 

Adapter Slot 5 寄存器类型 4 个 32 位状态 寄存器,地址范 围 [0,3]

 

主要包含系统输入输出数字 IO 状态

 

传输方向 T->O (elite--codesys)

 

Adapter Slot 6 寄存器类型 8 个 32 位状态 寄存器,地址范 围 [0,7]

 

主要包含系统模拟量输入输出值

 

传输方向 T->O(elite--codesys)

 

Adapter Slot 7 寄存器类型 18 个 32 位状 态寄存器,地址 范围 [0,17] 主要包含安全参数状态及值

 

传输方向 T->O(elite--codesys)

 

Adapter Slot 8 寄存器类型 46 个 32 位状 态寄存器,地址 范围 [0,45] 主要包含时间等信息

 

传输方向 T->O (elite--codesys)

 

Adapter Slot 9 寄存器类型 64 个 8 位状态 寄存器,地址范 围 [0,63]

 

主要包含输入 M 变量,M912 开始

 

传输方向 O->T(codesys---elite)

 

Adapter Slot 10

 

寄存器类型 64 个 8 位状态 寄存器,地址范 围 [0,63] 主要包含输出 M 变量,M400 开始传输方向 T->O(elite--codesys)

 

2. 配置及验证步骤

2-1.硬件接线与网络配置

这里网线连接采用了交换机,参考下图

 

机器人1、2与电脑需要在同一网段,并且不同地址,如图

电脑IP:192.168.1.202

 

机器人1IP:192.168.1.200

 

机器人2IP:192.168.1.201

 

2-2. codesys配置及使用步骤

2-2-1.新建工程

打开 codesys 软件,点击新建程序,如下所示

选择 project-Empty project,可根据需要命名,点击确定

 

2-2-3.安装EDS文件

加载安装 elite 的EDS 文件,在 Codesys 菜单栏-工具-设备存储库,点击安装,导入附件中对应 EC 机器人 eds 文件。导入后文件会出现在 EthernetIP 总线下,同时显示文件已经安装到设备存储库

 

 

2-2-4.添加设备

选择新建设备 Untitled1,右键点击添加设备,选择对应的 CODESYS Control Win V3 X64 中的 PLC,点击添加设备

 

选择新建的 PLC,点击右键选择添加设备

 

2-2-5.设备配置

选择现场总线--EthernetIP--以太网适配器--Ethernet,点击右下角添加设备

 

选择设备栏 Ethernet(Ethernet),点击右键选择添加设备,选择 Ethernet/IP Scanner,点击右下角添加设备

 

选择 Ethernet/IP Scanner,点击右键选择添加设备,选择 Elite Robot,点击右下角添加设备

 

将 EC 机器人设备添加后,点击 Elite Robot,选择通用设置从站(机器人)IP地址,与机器人 IP 地址一致,如下图所示(重复两次,添加2台机器人)

 

2-2-6.启动PLC

找到电脑右下角图标处,右键选中,Start PLC

 

双击 CODESYS Control Win V3 X86 设备,进入通讯设置,选择对应电脑名称,扫描设备

 

2-2-7.设置主站IP

设置 Ethernet 主站 IP 地址,双击 Ethernet,选择通用中的“...”,选择对应的以太网,如下图所示

 

2-2-8.组态机器人模块

选择 Elite Robot 模块进行配置,选择连接,根据需要添加连接,这里连接 Adapter Slot 0、1、2、3、4、9、10,包含 INT 输入输出寄存器、Float 输入输出寄存器、位置信息寄存器及 M 虚拟输入输出(通讯类型选择组播)

 

 

2-2-9.程序编译及下载

配置完成后就可以编译程序、下载程序已经模块使能了,如下图

 

2-2-10.运行与测试

下载完成后就可以运行程序了

 

通讯正常后左侧任务栏会出现绿色的图标,代表通讯正常

 

机器人导入脚本并运行,关联各 5 个 INT 输入输出和 Float 输入输出,脚本如下所示(具体释义可参考 LUA 脚本手册)

while (1) do
---------------EIP-INT输入寄存器------------------------
   a=get_eip_int_input_registers (0,10)--QD68/QD72-不同plc对应不同
    if a~=nil then
   set_global_variable ("I0", a[1])--INT输入寄存器0
   set_global_variable ("I1", a[2])--INT输入寄存器1
   set_global_variable ("I2", a[3])--INT输入寄存器2
   set_global_variable ("I3", a[4])--INT输入寄存器3
   set_global_variable ("I4", a[5])--INT输入寄存器4
   set_global_variable ("I5", a[6])--INT输入寄存器5
   set_global_variable ("I6", a[7])--INT输入寄存器6
   set_global_variable ("I7", a[8])--INT输入寄存器7
   set_global_variable ("I8", a[9])--INT输入寄存器8
   set_global_variable ("I9", a[10])--INT输入寄存器9
   end
  --------------EIP-INT输出寄存器----------------------------- 
  
   b0=get_global_variable ("I10")
   b1=get_global_variable ("I11")
   b2=get_global_variable ("I12")
   b3=get_global_variable ("I13")
   b4=get_global_variable ("I14")
   b5=get_global_variable ("I15")
   b6=get_global_variable ("I16")
   b7=get_global_variable ("I17")
   b8=get_global_variable ("I18")
   b9=get_global_variable ("I19")
   
   set_eip_int_output_registers (0,10,{b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8 , b9})--INT输出寄存器0-9数值为b0-b9
                                               
  --------------EIP-Float输入寄存器----------------------------- 
  
  c=get_eip_float_input_registers(0,10)--QD196/QD200 
  if c~=nil then
   set_global_variable ("D0", c[1])--float输入寄存器0
   set_global_variable ("D1", c[2])--float输入寄存器1
   set_global_variable ("D2", c[3])--float输入寄存器2
   set_global_variable ("D3", c[4])--float输入寄存器3
   set_global_variable ("D4", c[5])--float输入寄存器4
   set_global_variable ("D5", c[6])--float输入寄存器5
   set_global_variable ("D6", c[7])--float输入寄存器6
   set_global_variable ("D7", c[8])--float输入寄存器7
   set_global_variable ("D8", c[9])--float输入寄存器8
   set_global_variable ("D9", c[10])--float输入寄存器9
  end
  
  --------------EIP-Float输出寄存器-----------------------------
  
   d0=get_global_variable ("D10")
   d1=get_global_variable ("D11") 
   d2=get_global_variable ("D12")	
   d3=get_global_variable ("D13") 
   d4=get_global_variable ("D14")
   d5=get_global_variable ("D15") 
   d6=get_global_variable ("D16")
   d7=get_global_variable ("D17") 
   d8=get_global_variable ("D18")
   d9=get_global_variable ("D19") 
   set_eip_float_output_registers (0 ,10 ,{d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7 , d8 , d9})--float输出寄存器0-9数值为d0-d9
                                                  
   sleep(0.2)
   
end

 
2-2-10.数据验证

Elite_Robot--EtherNET/IP IO 映射,机器人当前位置信息 Adapter Slot 4,将机器人当前基座信息发送到 Adapter Slot 4 变量中

 

 

Float 输出,将机器人数值发送到 codesys 变量,D010-D014 关联到 Adapter Slot 2 输出前 5 个数值,数据变化一致

 

 

Float 输入,将 codesys 数值发送到机器人变量,D000-D004 关联到 Adapter Slot 3 输入前 5 个数值,数据变化一致

 

 

INT 输出,将机器人数值发送到 codesys 变量,I010-I014 关联到 Adapter Slot 0 输入前 5 个数值,数据变化一致

 

 

INT输入,将codesys数值发送到机器人变量,I000-I004关联到Adapter Slot

1 输出前 5 个数值,数据变化一致

 

 

M 虚拟输入,将 Codesys 的 Bool 数值发送到机器人 M 虚拟输入变量,M912开始的 M 关联到 Adapter Slot 9 输出的 Bool 值(具体参考 Adapter Slot 9 定义数值),数据变化一致

 

 

M 虚拟输出,将机器人 M 虚拟输入变量数值发送到 Codesys 的 BOOL 值,M400开始的 M 关联到 Adapter Slot 10 输入的 BOOL 值(具体参考 Adapter Slot 10 定义数值),数据变化一致

 

3. 常见问题解答

设置主站IP的时候不成功、页面提示“没有到设备的连接,请重新扫描网络”

答:需要先打开PLC,再进行主站加载

 

其中有一台机器人通讯不成功,状态栏一直红色报警

答:检测一下机器人IP与电脑是否在同一网段,ping能否ping通,配置页面是否有设置对应的机器人IP.

 

通讯都正常了就是读取不到任何数据

答:检测一下通讯使能是否有打开,没有打开的情况下需要打开使能

输入了预备值当前值没有变化

答:需要在调试页面进行手动写入值

提交反馈