EC机器人JBI与LUA交互

2025-01-16

随着技术的不断进步,根据客户不同的需求,现在机器人的工作已经不仅仅是简单的执行运动指令,往往会伴随着大量的计算和通讯任务。其中通讯用来和外部设备交互,做数据传输或一些逻辑控制,而计算则常用来做一些数学运算,进制转换,机器人的位姿运算等等。

1.  EC 系列的 Lua 结构和 JBI 结构

而我们艾利特机械臂采用 jbi 程序+lua 脚本的方式来实现多种符合场景下的使用,将大量复杂的运算、通讯任务和运动程序进行分离,jbi 程序主要负责运动,lua 脚本用来数据运算和通讯交 互。这样可以保证运动任务的高效运行,不掺杂过多冗余的计算指令,同时脚本内容专一,只 负责后台运算和通讯。在稍微大型的项目中,分离式的设计不仅可以保证程序的易读性,同时在编写过程中也可以多人协作,计算和通讯的验证和示教点位工作并行进行。这种设计即保证了机器人基础功能运动指令的简单插入,同时大大提高了机器人能够执行任务的上限。 运动和计算的分离式设计,可以避免运动指令和计算指令的大量掺杂,导致调试阶段程序 调试效率低不好调试,后期运动程序与计算指令掺杂过多不易维护的情况,这也类似PLC 编程时,往往工程师喜欢用 STL 文本去实现重复复杂的运算指令。同时 JBI 程序搭配类工业风的示教器操作风格可以更快的示教点位,验证点位,程序调用等,而脚本使用 LUA 语言,可以使工程师无缝从 STL 文本编程切换。在脚本编程中,不仅可以 lua 语言本身的丰富的 API 外,还可以使用艾利特机器人实现的接口,获取机器人的各种状态和数据,使用机器人的硬件接口。 从设计角度来说,lua 的执行优先级没有 jbi 高,但是执行却是在同步执行的。所以在实际 使用中,lua 和 jbi 程序的执行往往需要互锁,两者进行逻辑上的同步,才能达到理想的效果。

2.  如何进行 Lua 脚本和 JBI 程序的交互

2.1 变量

如表格所示,艾利特机器人全局变量分为五种均可通过 jbi 和 lua 进行操作,通常使用情况下,会使用 B、I、D 变量进行 逻辑的交互和简单数据的传递,而 P 变量用作放置关节数据,V 变量用作放置笛卡尔数据。 P 变量和 V 变量存放对应的数据后,可以使用示教器手动移动到目标位置,或者通过移动指令 直接到指定的位置。

2.2输入输出

如上表格所示,用户也可以用数字输入输出或者模拟输入输出来进行lua与JBI的交互


3.JBI如何操作全局变量


JBI 代码:

NOP

// 设置全局变量 B0 为 1

SET B000 1

// 设置全局变量 I0 为 1

SET I000 1

// 设置全局变量 D0 为 1

SET D000

// 设置全局变量 P0 的 j1 数据 为 1

SET P000(0) 1

// 设置全局变量 V0 的 x 数据 为 1

SET V000(0) 1

// 将后面的数据赋值给 P0,当插入指令时,自动选取当前关节角度插入

// 插入后修改指令时,也是默认更新数据为当前关节角度

SETJOINT P000 170.2074,-85.7738,102.0724,-104.2114,89.9468,-14.3515,0.0000,0.0000

// 将后面的数据赋值给 P0,当插入指令时,自动选取当前关节角度插入

// 插入后修改指令时,也是默认更新数据为当前笛卡尔角度

SETPOSE V000 -517.8859,-34.5460,208.5253,3.1061,0.0081,1.6502

// 等待 B0 = 0

WAIT B000=0

// 等待 I0 = 0

WAIT I000=0

// 等待 D0 = 0

WAIT D000=0

END




LUA 代码:

Sleep(1)

-- 从全局变量获取数据

local b0 = get_global_variable("B0")

local i0 = get_global_variable("I0")

local d0 = get_global_variable("D0")

-- 对于 P,V 变量,由于存储连续的 6 个数据,可以通过以下几种方式获取

local j7 = {}

j7[1],j7[2],j7[3],j7[4],j7[5],j7[6] = get_global_variable("P0")

local pose0 = {}

pose0[1],pose0[2],pose0[3],pose0[4],pose0[5],pose0[6] = get_global_variable("V0")

local j1,j2,j3,j4,j5,j6 = get_global_variable("P0")

local p0 = {j1, j2, j3, j4, j5, j6}

local v0 = {get_global_variable("V0")}

-- 向全局变量赋值数据

-- 设置 B0 为 1

set_global_variable("B0", 1)

-- 设置 D0 为 1

set_global_variable("D0", 1)

-- 设置 I0 为 1

set_global_variable("I0", 1)

-- 设置 P0 的数据为 1,2,3,4,5,6

set_global_variable("P0", 1, 2, 3, 4, 5, 6)

-- 设置 V0 的数据为 1,2,3,4,5,6

set_global_variable("V0", 1, 2, 3, 4, 5,6)


4.1 使用全局变量简易交互示例



JBI 代码 :

NOP

// 设置数据

SET D000 0

SET D001 -90

SET D002 0

SET D003 -90

SET D004 90

SET D005 0

// 将 B001 设置为 1,使 lua 进行计算赋值

SET B001 1

// 等待 B001 为 0,等于 0 代表 lua 的计算赋值完成

WAIT B001=0

TIMER T=0.002 S

MOVJ P001 VJ=30% CR=0.0MM ACC=50 DEC=50

END


LUA 代码:
sleep(1)
elite_print("runing")
-- 等待 jbi 运行
repeat
elite_print("Waiting B1 == 1!")
until
(get_global_variable("B1") == 1)
-- 获取数据并赋值
local j1 = get_global_variable("D0")
local j2 = get_global_variable("D1")
local j3 = get_global_variable("D2")
local j4 = get_global_variable("D3")
local j5 = get_global_variable("D4")
local j6 = get_global_variable("D5")
set_global_variable("P1", j1, j2, j3, j4, j5, j6)
set_global_variable("B1", 0)
elite_print("done")


4.2运行效果

上述两个程序同时运行后,LUA 侧会一直等 B1=1,当 jbi 初始化 D 变量后,设置 B1 为 1,lua 侧开始获取数据并将其赋值给 P1,随后设置 B1 为 0,然后 JBI 侧检测到 B1 为 0,即运行到新的 P1


5.1 使用输入输出简易交互示例


JBI代码:

//前台设置数字输出0为1启动脚本

NOP

DOUT OT#(0) 1

//等待脚本执行完成

WAIT OT#(0)=0 

MOVEL V=200MM/S CR=0MM ACC=50 DEC=50 V1

END


lua代码:
while (true) do
repeat
--等待前台脚本启动
   o0=get_robot_io_status("o0")
sleep(0.01)
until(o0==1)
sleep(0.02)

client_send_data(ip,"start",0,port)
sleep(0.5)
   ret,recv=client_recv_data (ip,1,0,port)

while recv=="" do
sleep(3)
client_send_data(ip,"start",0,port)
sleep(0.5)
   ret,recv=client_recv_data (ip,1,0,port)
end
   tempString=string.format("%s",recv)
   CamData=string.split(tempString,",")

if tonumber(CamData[1])==1 then
set_global_variable("b2",1)
elseif tonumber(CamData[1])==0 then
set_global_variable("b2",0)
end
  rz=math.rad(tonumber(CamData[4]))
elite_print("机器人定位数据:","X=",CamData[2],",Y=",CamData[3],",RZ=",rz)
sleep(0.01)
     a1,a2,a3,a4,a5,a6=get_global_variable("V1")
sleep(0.02)
set_global_variable ("V1",tonumber(CamData[2]),tonumber(CamData[3]),a3,a4,a5,rz)
set_robot_io_status("o0",0)
--脚本执行完毕反馈给前台
end




download-669.svg comicon14.svg

电话咨询

download-397.svg comicon15.svg

免费试用

Vector.svg Frame.svg

微信小程序

img1.jpg

微信小程序

准备好突破增长瓶颈,开启智能制造了吗?
了解我们的机器人如何帮助您的业务增长
欢迎下载艾利特机器人资料

我已阅读并同意艾利特《隐私政策》《法律声明》

我已知晓并同意艾利特通过电子邮件发送相关资料

提交