目录

0、引言: 

1、本文使用的相关软硬件或产品: 

2、一些注意事项: 

2.1、涉及到的一些概念: 

2.2、配置以太网连接以及以及发送接收结构: 

2.3、用于数据交换的 EKI 函数

2.4、上位机应当如何传输: 

2.5、通过smartHMI查看传输的数据: 

3、Demo程序: 

4、结语: 


0、引言: 

        Demo基于Ethernet KRL,使用C#开发的上位机通过TCP/IP与库卡机械臂通讯,双方数据交换采用 xml 格式。        

        在开始之前,您需要确保您拥有库卡官方的 KST_Ethernet_KRL (懂的都懂)技术文档,本文章并不提供该文档。此外,如果您接受过库卡官方机械臂编程培训并熟悉 计算机网络 、XML 相关知识将更加有助于理解本文章。当然不熟悉也没关系,本文章提供可以直接使用的通讯Demo,您可以在此基础上搭建自己的机械臂运动控制程序。

        您还需要给机械臂安装 KUKA.Ethernet KRL 软件包(本文不提供该软件包),这是上位机与机械臂通讯的根基。该软件包具备以下功能:

  • 通过 EKI 交换数据;
  • 接收外部系统的 XML 数据;
  • 将 XML 数据发送给外部系统;
  • 接收外部系统的二进制数据;
  • 将二进制数据发送给外部系统; 

以及以下特性:

  • 机器人控制系统和外部系统作为客户端或服务器;
  • 通过基于 XML 的配置文件配置连接;
  • 配置“事件信息”;
  • 通过向外部系统发送Ping命令监控连接;
  • 从提交解释器读取和写入数据;
  • 从机器人解释器读取和写入数据; 

        当然,如果您是通过官方渠道购买了库卡的TCP通讯服务,那您应该已经拥有了以上提到的 KST_Ethernet_KRL 技术文档与 KUKA.Ethernet KRL 软件包。 


🌐 以下内容是构筑在您已安装完 KUKA.Ethernet KRL 软件包并且使用库卡官方通讯测试程序初步测试通过的基础上的:


1、本文使用的相关软硬件或产品: 

  • KUKA KR210 prime cr 及配套产品(如机械臂示教器等)
  • KUKA.WorkVisual 6.0.24
  • KUKA.Ethernet KRL 3.1
  • Windows 11 家庭中文版 21H2(OS 内部版本 22000.1219)
  • Visual Studio Community 2022 - 17.4.0
  • Microsoft .NET Framework 4.8.04084
  • 「.NET 桌面开发」工作负荷

2、一些注意事项: 

涉及到一些小细节,如果仅仅是想使用该demo可以直接跳过第2章。 

2.1、涉及到的一些概念: 

术语名说明
数据流连续的数据组序列,其末尾无法提前预见。各个数据组具有任意而固定的类型。每个时间单位的数据组量(数据率)可能有所不同。只能按顺序访问这些数据。
EKIEthernet KRL Interface(以太网KRL接口)
EOSEnd Of Stream(末尾字符串)标记数据组末尾的字符串
以太网以太网是局域数据网络(LAN)的数据网络技术,它实现了使数据以数据框架的形式在所连接用户之间的交换。
FIFO

可处理数据存储器的方法:

  • First In First Out(先进先出):最先保存的元素将最先重新从存储器中取出。
  • Last In First Out(后进先出):最后保存的元素将最先重新从存储器中取出。
LIFO
KLI

KUKA 线路接口:

        将设备集成到客户网络的生产线总线。

KR C

库卡机器人控制器:

        KR C 是 KUKA 机器人控制系统。

KRL

KUKA Robot Language(库卡机器人编程语言):

        KRL 是 KUKA 机器人编程语言。

smartHMI

smart Human-Machine Interface(smart 人机界面):

        KUKA smartHMI 是 KUKA 系统软件的操作界面。

Socket

套接字

        将 IP 地址和端口号相互连接的软件接口。

TCP/IP

Transmission Control Protocol(传输控制协议):

        有关网络用户间数据交换的协议。TCP 可在网络连接的两个终点之间建立一个虚拟通道。在这个通道上可双向传输数据。

UDP/IP

User Datagram Protocol(用户数据报协议):

        有关网络用户间数据交换的无连接协议。

IP

Internet Protocol(因特网协议):

        因特网协议的任务是通过物理 MAC 地址定义子网络。

XML

Extensible Markup Language(可扩展的标记语言):

        以规定的树状结构创建人机可读文档的标准。

XPath

XML Path 语言:

        用于描述和读取 XML 文件部分的语言。

2.2、配置以太网连接以及以及发送接收结构: 

        以太网连接通过 xml 文件进行配置。针对每个连接,必须在机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EtherKRL 中新建并定义一个配置文件;注意,这是在库卡机械臂方需要配置的文件,上位机无需配置。机械臂在连接初始化时将读入该配置。

        同时我们一般还会在定义的配置文件中配置用于数据接收和发送的 XML 结构。当然这一部分结构是取决于用户希望上位机和机械臂之间要交换哪些数据。所以一般的 xml 配置文件形式应当如下方这样:

<ETHERNETKRL>
    <CONFIGURATION>
        <EXTERNAL></EXTERNAL>
        <INTERNAL></INTERNAL>
    </CONFIGURATION>
    <RECEIVE>
        <ELEMENTS></ELEMENTS>
    </RECEIVE>
    <SEND>
        <ELEMENTS></ELEMENTS>
    </SEND>
</ETHERNETKRL>
说明

<CONFIGURATION>

...

</CONFIGURATION>

配置外部系统和 EKI 之间的连接参数

<RECEIVE>

...

</RECEIVE>

配置机器人控制系统接收的接收结构

<SEND>

...

</SEND>

配置机器人控制系统发送的发送结构

        ❗ xml 文件都是严格区分大小写的。

        本文Demo程序机械臂使用的 xml 配置文件为仓库中名为 XmlTransmit.xml 的文件,要使用本文的Demo需要将该 xml 文件拷贝到机器人控制系统的对应目录下。

        xml 文件名称同时也是 KRL 的访问键。比如Demo中配置文件名为 XmlTransmit ,则机械臂方编程时相应的 EKI 函数中就会使用该文件名字符串作为访问键。比如:

EKI_INIT("XmlTransmit")

2.3、用于数据交换的 EKI 函数

初始化、打开、关闭和删除连接
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[])

2.4、上位机应当如何传输: 

        无论配置何种用于数据接收和发送的 XML 结构,上位机向机械臂发送数据都是将普通文本字符串转换为字节流后发送。所以无论 XML 结构中配置了要传整型、浮点型、布尔型或者字符串等等数据类型给机械臂,对上位机来说都只是传输字符串过去(比如整型、浮点型就传输数字字符串;bool型就传输"true"、"false"或者"1"、"0"字符串),机器人控制系统会根据配置好的 xml 文件来解析收到的字符串,从而得到对应的数据类型。对上位机来说,仅仅只有一个要求,那就是发送的字符串一定得符合机器人控制系统中定义的那个配置文件中的 XML 结构

        综上所述,机器人控制系统中配置的 xml 文件内容KRL 代码内容上位机发送的字符串内容,应当满足如下关系:

<!-- 机器人控制系统中 xml 配置文件内容范例
(这是范例所以仅演示了用于数据接收的 XML 结构的部分内容): -->
<RECEIVE>
    <XML>
        <ELEMENT Tag="Sensor/Message" Type="STRING" />        
        <!-- 定义机械臂要接收一个string类型的传感器信息数据 -->
        <ELEMENT Tag="Sensor/Status/IsActive" Type="BOOL" />
        <!-- 定义机械臂要接收一个bool类型的传感器状态是否启用数据 -->
    </XML>
</RECEIVE>
<!-- 我们假设该 xml 配置文件命名为 Channel_1.xml -->
; 以下是KRL代码,在KRL中英文逗号";"为行注释标志:
; Declaration
INT i
DECL EKI_STATUS RET
CHAR valueChar[256]
BOOL valueBOOL

; ATTENTION: The KRL variables *must* be initialized first!
; 注意:用于存放接收数据的 KRL 变量*必须*先经过初始化!
FOR i=(1) TO (256)
    valueChar[i]=0
ENDFOR
valueBOOL=FALSE

; Read data
RET=EKI_GetString("Channel_1", "Sensor/Message", valueChar[])
RET=EKI_GetBool("Channel_1", "Sensor/Status/IsActive", valueBOOL)


//机器人控制系统接收到的 符合配置好的数据接收 XML 结构的 字符串内容:
<Sensor>
    <Message>Example message</Message>
    <Status>
        <IsActive>ture</IsActive>
    </Status>
</Sensor>

/*这里我为了便于阅读用了换行和缩进,实际上上位机发过去的字符串
  就是一个从头到尾连在一起的字符串,就像下面这样:*/
<Sensor><Message>Example message</Message><Status><IsActive>ture</IsActive></Status></Sensor>

        此外,本文Demo从机械臂方发送到上位机的数据也仅仅是字符串,Demo中上位机端还未提供解析代码来解析 XML 结构,大佬有需求可自行补充。 

2.5、通过smartHMI查看传输的数据: 

        想要在库卡 smartPAD 示教器(smartPAD是用于工业机器人的手持编程器)上调试程序测试通讯是否成功,我们可以将机械臂端收到的数据交给全局变量,通过 smartHMI 查看该全局变量的值即可确定传输是否成功:

声明全局变量
示教器显示全局变量

3、Demo程序: 

        在通讯Demo中,上位机作为 服务端 监听连接,而库卡机械臂作为 客户端 连接至服务端,双方数据使用 xml 格式传输。Demo中还提供了一个基于 BytesIO TCP 通讯库的服务端和客户端测试程序,可以用于测试库卡机械臂通讯程序。此外,机械臂端的 xml 配置文件、src 源码文件和 dat 数据文件也包含在里面,要使用该Demo需要把这三个文件拷贝到机器人控制系统中的对应目录下。

GitHub:https://github.com/YMGogre/KUKATCPCommunicationDemo.git

Gitee:https://gitee.com/YMGogre/KUKATCPCommunicationDemo.git

CSDN下载​​​​​:https://download.csdn.net/download/YMGogre/87003119

xml 配置文件存放目录:C:\KRC\ROBOTER\Config\User\Common\EtherKRL

KRL 模块程序(src 源码文件 + dat 数据文件)存放目录:C:\KRC\ROBOTER\Program

        关于程序使用操作细则请参考Demo中的 README.md

        💠tips:下载Demo后打开解决方案,可能会发现错误列表栏弹出一些错误信息: CS0246 未能找到类型或命名空间名为"STTech"(是否缺少 using 指令或程序集引用?) 等。这是因为解决方案中那两个基于 BytesIO TCP 通讯库的服务端和客户端测试程序项目中还未正确引用 BytesIO TCP 通讯库,我们有两项解决办法:

  1. 右击报出错误信息的那个项目的"引用",选择"管理 NuGet 程序包(N)",根据上面弹出的提示点击"还原(R)":
  2. 如果上面的方法没有弹出提示信息,我们可以选择重新安装 BytesIO TCP 通讯库:
    • 首先在 NuGet 包管理器中卸载已安装的三个包(三个包之间存在依赖关系,所以需要按顺序卸载。卸载顺序:STTech.BytesIO.TCP ==> STTech.BytesIO.Core ==> STTech.CodePlus):
    • 三个包卸载完之后,搜索 "bytesIO" ,找到 STTech.BytesIO.Tcp 并安装:
    • 完成!重新生成解决方案看看,应该就没有错误信息了。

    注:第二个方法卸载是三个包全都卸载了,但安装只用安装 STTech.BytesIO.Tcp 就可以了。 

4、结语: 

        基于 Ethernet KRL,通过 TCP/IP 可以实现计算机与 KUKA 机械臂的直接通信,但还无法实现外部自动运行。因为 KUKA 机器人的外部自动运行模式依赖于配置 CELL.SRC 程序和外部自动运行接口的输入/输出端。显然,计算机是无法为 KUKA 机器人配置 IO 口的,我们必须依赖于 PLC 才能完成输入/输出端的配置。感兴趣的读者可以自行搜索相关信息。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐