kuka编程(二):Ethernet KRL
本文最后更新于 203 天前,其中的信息可能已经有所发展或是发生改变。

Ethernet KRL

1.配置以太网连接

通过 XML 文件配置以太网连接。针对每个连接,必须在机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中定义一个配置文件。在连接初始化时将读入该配置。

2.数据交换

数据接收 基本流程 :

  1. 外部系统发送数据,通过协议传输数据并由 EKI 接收。
  2. 数据以一定的结构储存在数据存储器中。
  3. 从 KRL 程序以一定的结构存取数据。利用 KRL 指令读取数据并复制到KRL 变量中。

数据发送 基本流程 :

  1. 利用 KRL 指令将数据以一定的结构写入数据存储器中。
  2. 用 KRL 指令从存储器中读取数据。
  3. EKI 通过协议将数据发送给外部系统

数据保存

3.客户端 - 服务器运行模式

机器人控制系统和外部系统作为客户端和服务器相互连接。其中,外部系统可以是客户端或服务器。激活的连接数量限制在 16 个。

image-20240606203015336

EKI 配置为服务器时,只能有一个单独的客户端与服务器连接。如果需要多个连接,则还要创建多台 EKI 服务器。可以同时在 EKI 内部运行多个客户端和服务器

4.编程

在机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中定义一个配置文件。XML 文件都是 “ 区分大小写 ” 的。必须注意区分大小写。

XML 文件的名称同时也是 KRL 的访问密钥。
示例:…\EXT.XML —> EKI_INIT("EXT")

<ETHERNETKRL>

​   <CONFIGURATION>

​       <EXTERNAL></EXTERNAL>

​       <INTERNAL></INTERNAL>

​   </CONFIGURATION>

​   <RECEIVE>

​       <ELEMENTS></ELEMENTS>

​   </RECEIVE>

​   <SEND>

​       <ELEMENTS></ELEMENTS>

​   </SEND>

</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>
    <EXTERNAL>
        <IP>172.1.10.5</IP>
        <PORT>60000</PORT>
        <TYPE>Server</TYPE>
    </EXTERNAL>
    <INTERNAL>
        <ENVIRONMENT>Program</ENVIRONMENT>
        <BUFFERING Mode="FIFO" Limit="10"/>
        <BUFFSIZE Limit="16384"/>
        <TIMEOUT Connect="60000"/>
        <ALIVE Set_Out="666" Ping="200"/>
        <IP>192.1.10.20</IP>
        <PORT>54600</PORT>
        <PROTOCOL>TCP</PROTOCOL>
        <MESSAGES Logging="error" Display="disabled"/>
    </INTERNAL>
</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>
    <XML>
        <ELEMENT Tag="Ext/Str" Type="STRING"/>
        <ELEMENT Tag="Ext/Pos/XPos" Type="REAL" Mode="LIFO"/>
        <ELEMENT Tag="Ext/Pos/YPos" Type="REAL"/>
        <ELEMENT Tag="Ext/Pos/ZPos" Type="REAL"/>
        <ELEMENT Tag="Ext/Temp/Cpu" Type="REAL" Set_Out="1"/>
        <ELEMENT Tag="Ext/Temp/Fan" Type="REAL" Set_Flag="14"/>
        <ELEMENT Tag="Ext/Integer/AState" Type="INT"/>
        <ELEMENT Tag="Ext/Integer/BState" Type="INT"/>
        <ELEMENT Tag="Ext/Boolean/CState" Type="BOOL"/>
        <ELEMENT Tag="Ext/Frames/Frame1" Type="FRAME"/>
        <ELEMENT Tag="Ext/Attributes/@A1" Type="STRING"/>
        <ELEMENT Tag="Ext/Attributes/@A2" Type="INT"/>
        <ELEMENT Tag="Ext" Set_Flag="56"/>
    </XML>
</RECEIVE>
<RECEIVE>
    <RAW>
        <ELEMENT Tag="RawData" Type="BYTE" Size="1408"
        Set_Flag="14"/>
    </RAW>
</RECEIVE>
<RECEIVE>
    <RAW>
        <ELEMENT Tag="MyStream" Type="STREAM" EOS="123,134,21" Size="836"                    Set_Flag="14"/>
    </RAW>
</RECEIVE>

4.3用于发送数据的 XML 结构

配置取决于是发送 XML 数据还是二进制数据。

  • 如果是发送 XML 数据,必须定义 XML 结构:<XML> … </XML>

  • 发送二进制数据直接在 KRL 编程中实现。无须指定配置。

属性 说明
ELEMENT 元素名称 在此定义用于发送数据的 XML 结构 (XPath)。

示例

<SEND>
    <XML>
        <ELEMENT Tag="Robot/Data/ActPos/@X"/>
        <ELEMENT Tag="Robot/Data/ActPos/@Y"/>
        <ELEMENT Tag="Robot/Data/ActPos/@Z"/>
        <ELEMENT Tag="Robot/Data/ActPos/@A"/>
        <ELEMENT Tag="Robot/Data/ActPos/@B"/>
        <ELEMENT Tag="Robot/Data/ActPos/@C"/>
        <ELEMENT Tag="Robot/Status"/>
        <ELEMENT Tag="Robot/Mode"/>
        <ELEMENT Tag="Robot/Complex/Tickcount"/>
        <ELEMENT Tag="Robot/RobotType/Robot/Type"/>
    </XML>
</SEND>

4.4按照 XPath 框架配置

使用 XML 进行数据交换时,交换的 XML 文件必须按照相同框架构建。 Ethernet KRL 使用 XPath 框架进行 XML 文件的描述和读取。

根据 XPath 需区分下列情况:

  • 描述和读取元素
  • 描述和读取属性
  • 元素写法
  • 保存的用于发送数据的 XML 文件:
<Robot>
    <Mode>...</Mode>
    <RobotLamp>
        <GrenLamp>
            <LightOn>...</LightOn>
        </GrenLamp>
    </RobotLamp>
</Robot>
  • 发送数据所配置的 XML 结构
<SEND>
    <XML>
        <ELEMENT Tag="Robot/Mode" />
        <ELEMENT Tag="Robot/RobotLamp/GrenLamp/LightOn" />
    </XML>
<SEND />
  • 元素写法
  • 保存的用于发送数据的 XML 文件
<Robot>
    <Data>
        <ActPos X="...">
        </ActPos>
        <LastPos A="..." B="..." C="..." X="..." Y="..." Z="...">
        </LastPos>
    </Data>
</Robot>
<SEND>
    <XML>
        <ELEMENT Tag="Robot/Data/LastPos/@X" />
        <ELEMENT Tag="Robot/Data/LastPos/@Y" />
        ...
        <ELEMENT Tag="Robot/Data/ActPos/@X" />
    </XML>
<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()
2 ...
3 RET=EKI_Init("Connection") //将 EKI 与外部系统连接的通道初始化。
4 RET=EKI_Open("Connection") //打开通道。
5 ...                      //用于将数据写入存储器、发送数据或访问已接收的数据的 KRL指令
6 Write data, send data or get received data
7 ...
8 RET=EKI_Close("Connection") //关闭通道
9 RET=EKI_Clear("Connection") //删除通道
10 ...
11 END

编程时须注意 EKI 是配置为服务器还是客户端。

服务器运行模式

  • 当外部系统配置为客户端时,EKI_Open() 会将 EKI (= 服务器)置于监听状态。服务器等待客户端的连接问询,但不中断程序运行。如果配置文件中未描述元素 <TIMEOUT Connect="…"/>,服务器将一直等待,直至客户端请求连接为止。
  • 客户端的连接问询通过访问 EKI 或通过事件信息表示,例如通过元素 <ALIVE
    SET_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>
    <ActPos X="1000.12"></ActPos>
    <Status>12345678</Status>
</Robot>
  • 编程
DECL EKI_STATUS RET
RET=EKI_Send("Channel_1","Robot")
  • 发送的 XML 结构:
<Robot>
    <ActPos X="1000.12"></ActPos>
    <Status>12345678</Status>
</Robot>

发送 XML 结构的一部分

  • 保存的用于发送数据的 XML 结构与之前相同

  • 编程

DECL EKI_STATUS RET
RET=EKI_Send("Channel_1","Robot/ActPos")
  • 发送的 XML 结构
<Robot>
    <ActPos X="1000.12"></ActPos>
</Robot>

5.4.2直接发送字符串:

5.4.3发送二进制数据:

发送固定长度 (10字节)的二进制数据组

发送有末尾字符串和可变长度的二进制数据组:

发送有末尾字符串和可变长度、限制为字符最大值的二进制数据组:

5.5读取数据

​ 读取数据时,必须通过数值赋值等方式,将相应的 KRL 变量初始化。

  • ​ 如要读取 XML 数据,可使用所有存取函数 EKI_Get…() 。

  • ​ 如要从存储器中读取二进制数据组,必须使用存储函数EKI_GetString()

读取 XML 数据:

用于数据接收的 XML 结构

<RECEIVE>
    <XML>
        <ELEMENT Tag="Sensor/Message" Type="STRING" />
        <ELEMENT Tag="Sensor/Status/IsActive" Type="BOOL" />
    </XML>
</RECEIVE>

编程:

; Declaration
INT i
DECL EKI_STATUS RET
CHAR valueChar[256]
BOOL valueBOOL

; Initialization
FOR i=(1) TO (256)
    valueChar[i]=0
ENDFOR
valueBOOL=FALSE

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>1</IsActive>
    </Status>
</Sensor>

读取二进制数据组

5.6删除数据存储器

  • 通过 EKI_Clear() 删除:删除所有数据存储器,退出以太网连接

  • 通过 EKI_ClearBuffer() 删除:删除特定数据存储器,不退出以太网连接

5.7EKI_STATUS – 函数特定返回值的结构

EKI 的每项函数都会返回函数特定的数值。EKI_STATUS 是这些数值写入的全 局结构变量。

5.8配置事件信息

通过给输出端或旗标赋值,可报告下列事件:

  • 连接已激活。
  • 出现一个单独的 XML 元素。
  • 出现一个完整的 XML 结构或一个完整的二进制数据组。

image-20240606203215197

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

image-20240606203300420

5.9 接收完整的 XML 数据组

存取函数 EKI_Get...() 会一直保持禁用,直至一个 XML 数据组中的所有数据 都位于存储器中为止。

当配置为 LIFO,且有 2 个或多个 XML 数据组相继出现时,不再确保从存储器 中连续地取出一个数据组。例如可能出现这样的情况:尽管第一个数据组尚未 完全处理好,但是第二个数据组的数据已储存在存储器中。由于在 ILFO 运行 模式下,始终是先存取最后一次保存的数据,因此导致 KRL 中可用的数据组 不一致。

为防止在 ILFO 运行模式下数据组出现碎片化现象,必须禁止处理新接收的数 据,直至从存储器中取出所有关联的数据为止。

...
 RET=EKI_Lock("MyChannel")
 RET=EKI_Get...()
 RET=EKI_Get...()
 ...
 RET=EKI_Get...()
 RET=EKI_Unlock("MyChannel")
 ...

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
  INTERRUPT DECL 89 WHEN $FLAG[1]==FALSE DO CON_ERR()
  INTERRUPT ON 89
 ;ENDFOLD

在中断程序中,用 EKI_CHECK() 查询发生了什么错误,然后重新打开连 接。

DEF CON_ERR()
 DECL EKI_STATUS RET
 RET={Buff 0,Read 0, Msg_no 0, Connected false}
 EKI_CHECK(RET,#Quit,"XmlTransmit")
 RET=EKI_OPEN("XmlTransmit")
 END

6.实例程序

Ethernet KRL 的供货范围包括一个服务器程序及多个示例配置和示例程序。 利用这些示例配置和示例程序,可以在服务器程序与机器人控制系统之间建立 通讯。

image-20240606203803679

6.1接入服务器程序和示例

外部系统:

​  已安装 .NET-Framework 3.5 或更高版本的 Windows 操作系统

机器人控制系统:

​  专家用户组

​  运行方式T1或者T2

操作步骤

  1. 将服务器程序复制到外部系统上。
  2. 将 XML 示例配置粘贴到机器人控制系统的目录 C:\KRC\ROBOTER\Config\User\Common\EthernetKRL 中。
  3. 将 KRL 示例程序粘贴到机器人控制系统的目录 C:\KRC\ROBOTER\Program 中。
  4. 启动外部系统上的服务器程序。
  5. 按下菜单按钮。窗口通讯属性打开。
  6. 只有当外部系统有多个网络接口可用时:输入与机器人控制系统通讯时使 用的网络适配器编号(= 网卡索引)。
  7. 关闭窗口通讯属性并按下启动按钮。通讯时可用的 IP 地址会显示在信息 窗口中。
  8. 在所需的 XML 文件中设置显示的外部系统 IP 地址

6.2服务器程序操作界面

服务器程序可通过与机器人控制系统建立稳定连接,测试外部系统和机器人控 制系统之间的通讯。

服务器程序包含以下功能:

  1. 发送和接收数据(自动或手动)
  2. 显示接收的数据
  3. 显示发送的数据

image-20240606204203589

image-20240606204218687

image-20240606204224341

在服务器程序中设置通讯参数

操作步骤

​ 1.在服务器程序中点击菜单按钮。 窗口通讯属性打开。

​ 2.设置通讯伙伴。

​ 3.关闭窗口。

image-20240606204342905

image-20240606204348458

6.3 “BinaryFixed”示例

与机器人控制系统通讯时,必须在服务器程序中设置合适的示例数 据,例如这里是“BinaryFixed”。

EKI 配置为客户端。通过连接仅能接收固定长度为 10 字节、元素名称为 “Buffer”的二进制数据组。服务器程序发送一个数据组。EKI 接收到外部 数据后,$FLAG[1] 将被赋值。

XML文件

<ETHERNETKRL>
  <CONFIGURATION>
    <EXTERNAL>
      <IP>x.x.x.x</IP>
      <PORT>59152</PORT>
    </EXTERNAL>
  </CONFIGURATION>
  <RECEIVE>
    <RAW>
      <ELEMENT Tag="Buffer" Type="BYTE" Set_Flag="1" Size="10" />
    </RAW>
  </RECEIVE>
  </SEND>
 </ETHERNETKRL>

必须在 KRL 程序中用 CAST_TO() 和 CAST_FROM() 读入和读取固定长度的二进 制数据组。只可读取类型为 REAL(4 字节)的数据,非 Double(双精度) 型。

程序

 1 DEF BinaryFixed( )
 2 Declaration
 3 INI
 4 Initialize sample data 通过数值赋值将 KRL 变量初始化
 5
 6 RET=EKI_Init("BinaryFixed")  EKI_Init() 将 EKI 与外部系统连接的通道初始化。
 7 RET=EKI_Open("BinaryFixed") EKI_Open() 打开通道并与服务器连接。
 8
 9 OFFSET=0   CAST_TO 将数值写入 CHAR 数组 Bytes[]。
 10 CAST_TO(Bytes[],OFFSET,34.425,674345,"R",TRUE)
 11
 12 RET=EKI_Send("BinaryFixed",Bytes[])
 13
 14 WAIT FOR $FLAG[1]
 15 RET=EKI_GetString("BinaryFixed","Buffer",Bytes[])
 16 $FLAG[1]=FALSE
 17  $FLAG[1] 表示接收配置的数据元素。
     EKI_GetString 访问存储器并将数据复制到 CHAR 数组 Bytes[] 中。
     $FLAG[1] 被重置。
 18 OFFSET=0
 19 CAST_FROM(Bytes[], OFFSET, valueReal, valueInt, valueChar[], 
    valueBool)  
 20   CAST_FROM 读取 CHAR 数组 Bytes[] 包含的数值,并根据类型将其复制到给出的变量中。
 21 RET=EKI_Close("BinaryFixed")  关闭通道。
 22 RET=EKI_Clear("BinaryFixed") 删除通道。
 23 END

6.4 “BinaryStream”示例

EKI 配置为客户端。通过连接仅能接收长度最大为 64 字节、元素名称为 “Buffer”的二进制数据组。二进制数据组的末尾必须用末尾字符串 CR、LF 标记。当 EKI 接收到该元素时,$FLAG[1] 将赋值。

XML文件

ETHERNETKRL>
  <CONFIGURATION>
    <EXTERNAL>
      <IP>x.x.x.x</IP>
      <PORT>59152</PORT>
    </EXTERNAL>
  </CONFIGURATION>
  <RECEIVE>
    <RAW>
      <ELEMENT Tag="Buffer" Type="STREAM" Set_Flag="1" 
               Size="64" EOS="13,10" />
    </RAW>
    </RECEIVE>
  </SEND>
 </ETHERNETKRL>

程序

 1 DEF BinaryStream( )
 2 Declaration
 3 INI
 4 Initialize sample data
 5
 6 RET=EKI_Init("BinaryStream")
 7 RET=EKI_Open("BinaryStream")
 8
 9 Bytes[]="Stream ends with CR,LF"
 10
 11 RET=EKI_Send("BinaryStream",Bytes[])
 12
 13 WAIT FOR $FLAG[1]
 14 RET=EKI_GetString("BinaryStream","Buffer",Bytes[])
 15 $FLAG[1]=FALSE
 16
 17 RET=EKI_Close("BinaryStream")
 18 RET=EKI_Clear("BinaryStream")

6.5 “XmlTransmit”示例

EKI 配置为客户端。将发送机器人数据,等待 1 秒后,从存储器读取接收的 传感器数据。

XML文件

<ETHERNETKRL>
  <CONFIGURATION>
    <EXTERNAL>
      <IP>x.x.x.x</IP>
      <PORT>59152</PORT>
    </EXTERNAL>
  </CONFIGURATION>
  <RECEIVE>
    <XML>
      <ELEMENT Tag="Sensor/Message" Type="STRING" />
      <ELEMENT Tag="Sensor/Positions/Current/@X" Type="REAL" />
      <ELEMENT Tag="Sensor/Positions/Before/X" Type="REAL" />
      <ELEMENT Tag="Sensor/Nmb" Type="INT" />
      <ELEMENT Tag="Sensor/Status/IsActive" Type="BOOL" />
      <ELEMENT Tag="Sensor/Read/xyzabc" Type="FRAME" />
      <ELEMENT Tag="Sensor/Show/@error" Type="BOOL" />
      <ELEMENT Tag="Sensor/Show/@temp" Type="INT" />
      <ELEMENT Tag="Sensor/Show" Type="STRING" />
      <ELEMENT Tag="Sensor/Free" Type="INT" />
    </XML>
  </RECEIVE>
  <SEND>
    <XML>
      <ELEMENT Tag="Robot/Data/LastPos/@X" />
      <ELEMENT Tag="Robot/Data/LastPos/@Y" />
      <ELEMENT Tag="Robot/Data/LastPos/@Z" />
      <ELEMENT Tag="Robot/Data/LastPos/@A" />
      <ELEMENT Tag="Robot/Data/LastPos/@B" />
      <ELEMENT Tag="Robot/Data/LastPos/@C" />
      <ELEMENT Tag="Robot/Data/ActPos/@X" />
      <ELEMENT Tag="Robot/Status" />
      <ELEMENT Tag="Robot/Mode" />
      <ELEMENT Tag="Robot/RobotLamp/GrenLamp/LightOn" />
    </XML>
    </SEND>
 </ETHERNETKRL>

程序

 1 DEF XmlTransmit( )
 2 Declaration
 3 Communicated data
 4 INI
 5 Initialize sample data
 6
 7 RET=EKI_Init("XmlTransmit")
 8 RET=EKI_Open("XmlTransmit")
 9
 10 Write data to connection
 11 Send data to external program
 12 Get received sensor data
 13
 14 RET=EKI_Close("XmlTransmit")
 15 RET=EKI_Clear("XmlTransmit")
 16
 17 END

6.6 “XmlServer”示例

EKI 配置为服务器。只要与外部系统存在连接,$FLAG[1] 就处于赋值状态。

XML文件

<ETHERNETKRL>
  <CONFIGURATION>
    <EXTERNAL>
      <TYPE>Client</TYPE>
    </EXTERNAL>
    <INTERNAL>
      <IP>x.x.x.x</IP>
      <PORT>54600</PORT>
      <ALIVE Set_Flag="1" />
    </INTERNAL>
  </CONFIGURATION>
  <RECEIVE>
    <XML>
      <ELEMENT Tag="Sensor/A" Type="BOOL" />
    </XML>
  </RECEIVE>
  <SEND>
     <XML>
      <ELEMENT Tag="Robot/B" />
    </XML>
  </SEND>
 </ETHERNETKRL>

程序

 1 DEF XmlServer( )
 2 Declaration
 3 INI
 4
 5 RET=EKI_Init("XmlServer")
 6 RET=EKI_Open("XmlServer")
 7
 8 ; wait until server is conntected
 9 wait for $FLAG[1
 10 ; wait until server is deconnected
 11 wait for $FLAG[1]==FALSE
 12
 13 RET=EKI_Clear("XmlServer")
 14 END

6.7“XmlCallback”示例

EKI 配置为客户端。将发送机器人数据,接收传感器数据,然后等待 \$FLAG[1]。\$FLAG[1] 表示已读取传感器数据。

XML 文件中配置了当 EKI 接收了所有传感器数据后,\$FLAG[998] 将赋值。该 旗标将触发程序中断。通过将标签“Sensor”配置为事件标签,可确保当所 有数据都位于存储器中时,才取出传感器数据。

已读取传感器数据时,将重置 \$FLAG[998] 并给 $FLAG[1] 赋值。

XML文件

<ETHERNETKRL>
  <CONFIGURATION>
    <EXTERNAL>
      <IP>x.x.x.x</IP>
      <PORT>59152</PORT>
    </EXTERNAL>
  </CONFIGURATION>
  <RECEIVE>
    <XML>
      <ELEMENT Tag="Sensor/Message" Type="STRING" />
      <ELEMENT Tag="Sensor/Positions/Current/@X" Type="REAL" />
      <ELEMENT Tag="Sensor/Positions/Before/X" Type="REAL" />
      <ELEMENT Tag="Sensor/Nmb" Type="INT" />
      <ELEMENT Tag="Sensor/Status/IsActive" Type="BOOL" />
      <ELEMENT Tag="Sensor/Read/xyzabc" Type="FRAME" />
 <ELEMENT Tag="Sensor/Show/@error" Type="BOOL" />
      <ELEMENT Tag="Sensor/Show/@temp" Type="INT" />
      <ELEMENT Tag="Sensor/Show" Type="STRING" />
      <ELEMENT Tag="Sensor/Free" Type="INT" Set_Out="998" />
      <ELEMENT Tag="Sensor" Set_Flag="998" />
    </XML>
  </RECEIVE>
  <SEND>
    <XML>
      <ELEMENT Tag="Robot/Data/LastPos/@X" />
      <ELEMENT Tag="Robot/Data/LastPos/@Y" />
      <ELEMENT Tag="Robot/Data/LastPos/@Z" />
      <ELEMENT Tag="Robot/Data/LastPos/@A" />
      <ELEMENT Tag="Robot/Data/LastPos/@B" />
      <ELEMENT Tag="Robot/Data/LastPos/@C" />
      <ELEMENT Tag="Robot/Data/ActPos/@X" />
      <ELEMENT Tag="Robot/Status" />
      <ELEMENT Tag="Robot/Mode" />
      <ELEMENT Tag="Robot/RobotLamp/GrenLamp/LightOn" />
    </XML>
  </SEND>
 </ETHERNETKRL

程序

 1 DEF XmlCallBack( )
 2 Declaration
 3 Communicated data
 4 INI
 5 Define callback
 6
 7 RET=EKI_Init("XmlCallBack")
 8 RET=EKI_Open("XmlCallBack")
 9
 10 Write data to connection
 11 RET=EKI_Send("XmlCallBack","Robot")
 12
 13 ;wait until data read
 14 WAIT FOR $FLAG[1]
 15
 16 RET=EKI_Close("XmlCallBack")
 17 RET=EKI_Clear("XmlCallBack")
 18 END
 19
 20 DEF GET_DATA()
 21 Declaration
 22 Initialize sample data
 23 Get received sensor data
 24 Signal read

数据发送

XML 文件由 KRL 程序用机器人数据来描述并通过 EKI 发送给外部系统。

<Robot>
  <Data>
   <LastPos X="..." Y="..." Z="..." A="..." B="..." C="...">
   </LastPos>
   <ActPos X="1000.12">
    </ActPos>
  </Data>
  <Status>12345678</Status>
  <Mode>ConnectSensor</Mode>
  <RobotLamp>
    <GrenLamp>
     <LightOn>1</LightOn>
    </GrenLamp
  </RobotLamp>
 </Robot>

数据接收

XML 文件由服务器程序用传感器数据来描述并由 EKI 接收。

 <Sensor>
  <Message>Example message</Message>
  <Positions>
  <Current X="4645.2" />
    <Before>
      <X>0.9842</X>
    </Before>
  </Positions>
  <Nmb>8</Nmb>
  <Status>
    <IsActive>1</IsActive>
  </Status>
  <Read>
    <xyzabc X="210.3" Y="825.3" Z="234.3" A="84.2" B="12.3"
            C="43.5" />
  </Read>
  <Show error="0" temp="9929">Taginfo in attributes</Show>
  <Free>2912</Free>
 </Sensor>
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇