kuka编程(二):Ethernet KRL
Ethernet KRL
1.配置以太网连接
通过 XML 文件配置以太网连接。针对每个连接,必须在机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中定义一个配置文件。在连接初始化时将读入该配置。
2.数据交换
数据接收 基本流程 :
- 外部系统发送数据,通过协议传输数据并由 EKI 接收。
- 数据以一定的结构储存在数据存储器中。
- 从 KRL 程序以一定的结构存取数据。利用 KRL 指令读取数据并复制到KRL 变量中。
数据发送 基本流程 :
- 利用 KRL 指令将数据以一定的结构写入数据存储器中。
- 用 KRL 指令从存储器中读取数据。
- EKI 通过协议将数据发送给外部系统
数据保存
3.客户端 - 服务器运行模式
机器人控制系统和外部系统作为客户端和服务器相互连接。其中,外部系统可以是客户端或服务器。激活的连接数量限制在 16 个。

将 EKI 配置为服务器时,只能有一个单独的客户端与服务器连接。如果需要多个连接,则还要创建多台 EKI 服务器。可以同时在 EKI 内部运行多个客户端和服务器
4.编程
在机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中定义一个配置文件。XML 文件都是 “ 区分大小写 ” 的。必须注意区分大小写。
XML 文件的名称同时也是 KRL 的访问密钥。 示例:…\EXT.XML —> EKI_INIT(“EXT”)
<ETHERNETKRL> |
阶段
说明
<CONFIGURATION> … </CONFIGURATION>
配置外部系统和 EKI 之间的连接参数**->4.1**
<RECEIVE> … </RECEIVE>
配置机器人控制系统接收的接收结构**->4.2**
<SEND> … </SEND>
配置机器人控制系统发送的发送结构**->4.3**
4.1连接属性的XML结构
在段落 <EXTERNAL > … </EXTERNAL > 中定义外部系统的设置:
-
元素
说明
TYPE
Server:外部系统是服务器。
Client:外部系统是客户端。
默认值: 服务器IP
外部系统定义为服务器时的 IP 地址。
如果 TYPE = 客户端,将忽略 IP 地址PORT
外部系统定义为服务器时的端口号
1 … 65534
在段落 <INTERNAL> … </INTERNAL> 中定义 EKI 的设置:
元素
属性
说明
ENVIRONMENT
-–
将删除连接与操作相结合 (可选)
Program:在机器人解释器操作后删除
Submit:在提交解释器操作后删除
System:在系统操作后删除
默认值: Program
BUFFERING
Mode
处理所有数据存储器的方法 (可选)
FIFO:先进先出
LIFO:后进先出
默认值: FIFO
Limit
数据存储器能够容纳的数据元素最大数量 (可选) 1 … 512 默认值: 16
BUFFSIZE
Limit
能够接收而无需解释的字节最大数量 (可选) 1 … 65534 字节 默认值: 16384 字节
TIMEOUT
Connect
尝试建立连接的时间,超过这段时间后将中止 尝试 (可选)0 … 65534 ms 默认值: 2000 ms
ALIVE
Set_Out/Set_Flag
连接成功时给输出端或旗标赋值 (可选)
输出端编号: 1 … 4096
旗标编号: 1 … 1024
只要有与外部系统的连接处于激活状态,旗标 或输出端就处于已赋值状态。如果与外部系统的连接中止,则输出端或旗标将被删除。
Ping
发送监控与外部系统连接的 Ping 命令的周期 (可选) 1 … 65534
IP
-–
EKI 定义为服务器时的 IP 地址
(EXTERNAL/TYPE = 客户端)
如果 EXTERNAL/TYPE = 服务器,将忽略 IP 地 址。
PORT
-–
EKI 定义为服务器时的端口号
54600-54615
PROTOCOL
-–
传输协议 (可选)
TCP
UPD
默认值: TCP 建议始终使用 TCP/IP 协议。
MESSAGES
Logging
禁用在 EKI 日志中写入信息 (可选)。
warning:记录警告信息和错误信息。
error:仅记录错误信息。
disabled:记录已禁用。
默认值: 错误
显示屏
禁用 smartHMI 上的输出信息。
默认值: 错误
实例
<CONFIGURATION> |
4.2用于数据接收的 XML 结构
配置取决于是接收 XML 数据还是二进制数据。
-
如果是接收 XML 数据,必须定义 XML 结构:
<XML> … </XML> -
如果是接收二进制数据,必须定义原始数据:
<RAW> … </RAW>XML 结构
<XML> … </XML>的元素中的属性:
元素
属性
ELEMENT
元素名称 在此定义用于接收数据的 XML 结构 (XPath)->4.4
ELEMENT
TYPE
元素的数据类型
STRING
REAL
INT
BOOL
FRAME
提示:当标签仅用于事件信息时,可选。在这种情况下不为该元素预留存储空间。 事件旗标示例:<ELEMENT Tag="Ext" Set_Flag="56"/>
ELEMENT
Set_Out/Set_Flag
接收到元素时给输出端或旗标赋值 (可选)
输出端编号:
1-4096
旗标编号:
1-1024
ELEMENT
Mode
处理数据存储器中的数据组的方法
FIFO:先进先出
LIFO:后进先出
只有当处理各个数据组的方法与 BUFFERING 下 为 EKI 配置的不同时才相关。
原始数据 <RAW> … </RAW> 中的元素的属性:
元素
属性
说明
ELEMENT
元素名称
ELEMENT
TYPE
元素的数据类型
BYTE:有固定长度的二进制数据组。
STREAM:有可变末尾字符串和可变长度的二 进制数据组
ELEMENT
Set_Out/Set_Flag
接收到元素时给输出端或旗标赋值 (可选)
输出端编号:
1 … 4096
旗标编号:
1 … 1024
ELEMENT
EOS
基本信息的末尾字符串 (只有当 Type = “STREAM” 时,才相关)
ASCII 编码: 1 … 32 个字符
备选结尾通过符号 “"隔开。
<ELEMENT … EOS=“123,134,21”/>
<ELEMENT … EOS=“123,134,21Ι13,10”/>
ELEMENT
Size
当 Type = “BYTE” 时,信息的固定大小
1 … 3600 字节
实例
<RECEIVE> |
<RECEIVE> |
<RECEIVE> |
4.3用于发送数据的 XML 结构
配置取决于是发送 XML 数据还是二进制数据。
-
如果是发送 XML 数据,必须定义 XML 结构:
<XML> … </XML> -
发送二进制数据直接在 KRL 编程中实现。无须指定配置。
属性
说明
ELEMENT
元素名称 在此定义用于发送数据的 XML 结构 (XPath)。
示例
<SEND> |
4.4按照 XPath 框架配置
使用 XML 进行数据交换时,交换的 XML 文件必须按照相同框架构建。 Ethernet KRL 使用 XPath 框架进行 XML 文件的描述和读取。
根据 XPath 需区分下列情况:
- 描述和读取元素
- 描述和读取属性
- 元素写法
- 保存的用于发送数据的 XML 文件:
<Robot> |
- 为发送数据所配置的 XML 结构:
<SEND> |
- 元素写法
- 保存的用于发送数据的 XML 文件:
<Robot> |
<SEND> |
5.用于数据交换的函数
Ethernet KRL 将相应的函数提供给机器人控制系统和外部系统之间的数据交换。
函数的详细说明可参见KST_Ethemet附录。
初始化、打开、关闭和删除连接
EKI_STATUS = EKI_Init(CHAR[])
EKI_STATUS = EKI_Open(CHAR[])
EKI_STATUS = EKI_Close(CHAR[])
EKI_STATUS = EKI_Clear(CHAR[])
发送数据
EKI_STATUS = EKI_Send(CHAR[], CHAR[], INT)
写入数据
EKI_STATUS = EKI_SetReal(CHAR[], CHAR[], REAL)
EKI_STATUS = EKI_SetInt(CHAR[], CHAR[], INT)
EKI_STATUS = EKI_SetBool(CHAR[], CHAR[], BOOL)
EKI_STATUS = EKI_SetFrame(CHAR[], CHAR[], FRAME)
EKI_STATUS = EKI_SetString(CHAR[], CHAR[], CHAR[])
读取数据
EKI_STATUS = EKI_GetBool(CHAR[], CHAR[], BOOL)
EKI_STATUS = EKI_GetBoolArray(CHAR[], CHAR[], BOOL[])
EKI_STATUS = EKI_GetInt(CHAR[], CHAR[], INT)
EKI_STATUS = EKI_GetIntArray(CHAR[], CHAR[], INT[])
EKI_STATUS = EKI_GetReal(CHAR[], CHAR[], REAL)
EKI_STATUS = EKI_GetRealArray(CHAR[], CHAR[], REAL[])
EKI_STATUS = EKI_GetString(CHAR[], CHAR[], CHAR[])
EKI_STATUS = EKI_GetFrame(CHAR[], CHAR[], FRAME)
EKI_STATUS = EKI_GetFrameArray(CHAR[], CHAR[], FRAME[])
检查函数是否出现错误
EKI_CHECK(EKI_STATUS, EKrlMsgType, CHAR[])
删除、禁用、解禁、检查数据存储器
EKI_STATUS = EKI_Clear(CHAR[])
EKI_STATUS = EKI_ClearBuffer(CHAR[], CHAR[])
EKI_STATUS = EKI_Lock(CHAR[])
EKI_STATUS = EKI_Unlock(CHAR[])
EKI_STATUS = EKI_CheckBuffer(CHAR[], CHAR[])
5.1提示
- 建议为每个发送和接收任务打开一个单独的通道。
- 使用 KUKA.MultiSubmitInterpreter 时,上述发送和接收特性同样适用。
- 在预进中执行 EKI 指令!
5.2初始化和删除连接
必须用函数 EKI_Init() 创建连接并初始化。此时将读入函数中给出的连接配置。既可在机器人解释器,也可在提交解释器中创建连接。可在机器人或提交解释器中通过函数 EKI_Clear() 重新删除连接。此外,删除连接可与机器人或提交解释器的操作或系统操作对接。(可通过连接配置中的 <ENVIRONMENT> 元素配置)
5.3打开和关闭连接
通过一个 KRL 程序建立与外部系统的连接
1 DEF Connection() |
编程时须注意 EKI 是配置为服务器还是客户端。
服务器运行模式
- 当外部系统配置为客户端时,
EKI_Open()会将 EKI (= 服务器)置于监听状态。服务器等待客户端的连接问询,但不中断程序运行。如果配置文件中未描述元素<TIMEOUT Connect="…"/>,服务器将一直等待,直至客户端请求连接为止。 - 客户端的连接问询通过访问 EKI 或通过事件信息表示,例如通过元素
<ALIVESET_OUT="…"/>。 - 如果在服务器期待连接问询的过程中要中断程序运行,必须编程设定一个事件 旗标或输出端,例如
WAIT FOR $OUT[…]。
建议在服务器运行模式下不要使用 EKI_Close()。在服务器运行模式下,将从外部客户端关闭通道。
5.4发送数据
根据配置和编程不同,可用 EKI_Send() 发送下列数据
通过 XML 结构通讯时:
- 完整的 XML 结构
- XML 结构的一部分
- 可变长度的任意字符串
通过原始数据通讯时:
- 对于有固定长度的二进制数据组 (属性 Type = “BYTE”):有固定长度的任意字符串
- 用字节表示的字符串大小必须与配置的属性 Size (大小)完全相符。超出时将输出错误信息,低于时将输出警告信息。
- 必须在 KRL 程序中用
CAST_TO()读入固定长度的二进制数据组。只可读取类型为 REAL (4 字节)的数据,非 Double (双精度)型
5.4.1 发送 XML 数据:
发送完整的 XML 结构
- 保存的用于发送数据的 XML 结构:
<Robot> |
- 编程
DECL EKI_STATUS RET |
- 发送的 XML 结构:
<Robot> |
发送 XML 结构的一部分:
-
保存的用于发送数据的 XML 结构与之前相同
-
编程
DECL EKI_STATUS RET |
- 发送的 XML 结构
<Robot> |
5.4.2直接发送字符串:
5.4.3发送二进制数据:
发送固定长度 (10字节)的二进制数据组
发送有末尾字符串和可变长度的二进制数据组:
发送有末尾字符串和可变长度、限制为字符最大值的二进制数据组:
5.5读取数据
读取数据时,必须通过数值赋值等方式,将相应的 KRL 变量初始化。
-
如要读取 XML 数据,可使用所有存取函数
EKI_Get…() 。 -
如要从存储器中读取二进制数据组,必须使用存储函数
EKI_GetString()。
读取 XML 数据:
用于数据接收的 XML 结构
<RECEIVE> |
编程:
; Declaration |
用传感器数据描述的 XML 文件 (已接收的数据):
<Sensor> |
读取二进制数据组
5.6删除数据存储器
-
通过
EKI_Clear()删除:删除所有数据存储器,退出以太网连接 -
通过
EKI_ClearBuffer()删除:删除特定数据存储器,不退出以太网连接
5.7EKI_STATUS – 函数特定返回值的结构
EKI 的每项函数都会返回函数特定的数值。EKI_STATUS 是这些数值写入的全 局结构变量。
5.8配置事件信息
通过给输出端或旗标赋值,可报告下列事件:
- 连接已激活。
- 出现一个单独的 XML 元素。
- 出现一个完整的 XML 结构或一个完整的二进制数据组。

只要与外部系统的连接处于激活状态,\OUT\[23\] 即被赋值。连接不再激活 时,将重置 \\OUT[23]。

5.9 接收完整的 XML 数据组
存取函数 EKI_Get…() 会一直保持禁用,直至一个 XML 数据组中的所有数据 都位于存储器中为止。
当配置为 LIFO,且有 2 个或多个 XML 数据组相继出现时,不再确保从存储器 中连续地取出一个数据组。例如可能出现这样的情况:尽管第一个数据组尚未 完全处理好,但是第二个数据组的数据已储存在存储器中。由于在 ILFO 运行 模式下,始终是先存取最后一次保存的数据,因此导致 KRL 中可用的数据组 不一致。
为防止在 ILFO 运行模式下数据组出现碎片化现象,必须禁止处理新接收的数 据,直至从存储器中取出所有关联的数据为止。
... |
5.10 处理不完整数据组
可能会出现外部系统发送不完整数据组的情况。单个 XML 元素为空或完全缺 失,使得在一个班次的存储器中存在来自多个数据包的数据。
如果 KRL 中的数据组必须是连续的,则可使用变量 EKI_STATUS 的结构元素 Counter。使用 EKI_Get…Array 函数时,可从返回 Counter = 0 识别出时间 上不连续的数据
5.11 EKI_CHECK() – 检查函数是否有错误
Ethernet KRL 会在出现任何错误时在 smartHMI 上输出一条信息。可禁用信息 的自动输出。
接收时出错时将始终关闭连接。以太网连接中止时,作为错误策略,可编程设 定一个中断。
在配置文件 XmlTransmit.XML 中定义了在成功连接时 FLAG[1] 将赋值。 连接丢失时将重置 FLAG[1]。
<ALIVE Set_Flag="1"/> |
中断在 KRL 程序中声明并接通。重置 FLAG[1] 时,将执行中断程序。
FOLD Define callback |
在中断程序中,用 EKI_CHECK() 查询发生了什么错误,然后重新打开连 接。
DEF CON_ERR() |
6.实例程序
Ethernet KRL 的供货范围包括一个服务器程序及多个示例配置和示例程序。 利用这些示例配置和示例程序,可以在服务器程序与机器人控制系统之间建立 通讯。

6.1接入服务器程序和示例
外部系统:
已安装 .NET-Framework 3.5 或更高版本的 Windows 操作系统
机器人控制系统:
专家用户组
运行方式T1或者T2
操作步骤
- 将服务器程序复制到外部系统上。
- 将 XML 示例配置粘贴到机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中。
- 将 KRL 示例程序粘贴到机器人控制系统的目录 C:\KRC\ROBOTER\Program 中。
- 启动外部系统上的服务器程序。
- 按下菜单按钮。窗口通讯属性打开。
- 只有当外部系统有多个网络接口可用时:输入与机器人控制系统通讯时使 用的网络适配器编号(= 网卡索引)。
- 关闭窗口通讯属性并按下启动按钮。通讯时可用的 IP 地址会显示在信息 窗口中。
- 在所需的 XML 文件中设置显示的外部系统 IP 地址
6.2服务器程序操作界面
服务器程序可通过与机器人控制系统建立稳定连接,测试外部系统和机器人控 制系统之间的通讯。
服务器程序包含以下功能:
- 发送和接收数据(自动或手动)
- 显示接收的数据
- 显示发送的数据



在服务器程序中设置通讯参数
操作步骤
1.在服务器程序中点击菜单按钮。 窗口通讯属性打开。
2.设置通讯伙伴。
3.关闭窗口。


6.3 “BinaryFixed”示例
与机器人控制系统通讯时,必须在服务器程序中设置合适的示例数 据,例如这里是“BinaryFixed”。
EKI 配置为客户端。通过连接仅能接收固定长度为 10 字节、元素名称为 “Buffer”的二进制数据组。服务器程序发送一个数据组。EKI 接收到外部 数据后,$FLAG[1] 将被赋值。
XML文件
<ETHERNETKRL> |
必须在 KRL 程序中用 CAST_TO() 和 CAST_FROM() 读入和读取固定长度的二进 制数据组。只可读取类型为 REAL(4 字节)的数据,非 Double(双精度) 型。
程序
1 DEF BinaryFixed( ) |
6.4 “BinaryStream”示例
EKI 配置为客户端。通过连接仅能接收长度最大为 64 字节、元素名称为 “Buffer”的二进制数据组。二进制数据组的末尾必须用末尾字符串 CR、LF 标记。当 EKI 接收到该元素时,$FLAG[1] 将赋值。
XML文件
ETHERNETKRL> |
程序
1 DEF BinaryStream( ) |
6.5 “XmlTransmit”示例
EKI 配置为客户端。将发送机器人数据,等待 1 秒后,从存储器读取接收的 传感器数据。
XML文件
<ETHERNETKRL> |
程序
1 DEF XmlTransmit( ) |
6.6 “XmlServer”示例
EKI 配置为服务器。只要与外部系统存在连接,$FLAG[1] 就处于赋值状态。
XML文件
<ETHERNETKRL> |
程序
1 DEF XmlServer( ) |
6.7“XmlCallback”示例
EKI 配置为客户端。将发送机器人数据,接收传感器数据,然后等待 \FLAG\[1\]。\\FLAG[1] 表示已读取传感器数据。
XML 文件中配置了当 EKI 接收了所有传感器数据后,\$FLAG[998] 将赋值。该 旗标将触发程序中断。通过将标签“Sensor”配置为事件标签,可确保当所 有数据都位于存储器中时,才取出传感器数据。
已读取传感器数据时,将重置 \$FLAG[998] 并给 $FLAG[1] 赋值。
XML文件
<ETHERNETKRL> |
程序
1 DEF XmlCallBack( ) |
数据发送
XML 文件由 KRL 程序用机器人数据来描述并通过 EKI 发送给外部系统。
<Robot> |
数据接收
XML 文件由服务器程序用传感器数据来描述并由 EKI 接收。
<Sensor> |
