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>
<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 结构或一个完整的二进制数据组。
只要与外部系统的连接处于激活状态,\$OUT[23] 即被赋值。连接不再激活 时,将重置 \$OUT[23]。
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 的供货范围包括一个服务器程序及多个示例配置和示例程序。 利用这些示例配置和示例程序,可以在服务器程序与机器人控制系统之间建立 通讯。
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>
<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>