相机应用
1. 通讯介绍
目前机械臂和视觉设备(相机)通讯,有两种方式:
- 机械臂与相机通过TCP/IP通信,通过在程序树添加 lua 脚本触发相机拍照并获取数据,获取的数据类型有两种含义:
(1)机械臂直接获取需要的目标点位----绝对坐标;
(2)机械臂获取需要偏移的距离----相对坐标;
- 相机与 PLC 连接并触发拍照,PLC 与机械臂通过 Modbus、Profinet等通讯协议进行通讯, 拍照后由PLC把需要偏移的数值发给机械臂,根据相对位置进行X 、Y、RZ的偏移。
2. ARCS中相机通讯的方式
ARCS中可以使用socket通信来实现机器人与相机的TCP/IP通讯,在AUBO开发者官网中提供了相关示例
-- 示例相机使用TCP/IP方式进行通讯,进行拍照接收和发送数据
-- 导入 LuaSocket 模块
local socket = require("socket")
-- 设置超时时间(单位:秒)
local timeout_seconds = 5
-- 封装成函数,传参 server_ip、server_port、message
function send_and_receive(server_ip, server_port, message)
-- 创建 TCP 客户端 socket
local client = socket.tcp() -- 创建 TCP 套接字
client:settimeout(timeout_seconds) -- 设置超时时间,防止阻塞
-- 尝试连接服务器
local success, err = client:connect(server_ip, server_port)
if not success then
textmsg("连接服务器失败: " .. tostring(err))
return nil -- 连接失败则直接退出脚本
end
textmsg("已连接到服务器: " .. server_ip .. ":" .. server_port)
-- 要发送的消息内容,查看对应相机的通讯协议
local bytes, send_err = client:send(message .. "\n") -- 添加换行符以便服务器识别为一整行
if not bytes then
textmsg("发送失败: " .. tostring(send_err))
client:close()
textmsg("已断开与服务器的连接。")
return nil
else
textmsg("发送成功: " .. message)
end
-- 接收服务器返回的数据(按行读取)
local response, recv_err = client:receive("*a") -- *a读取全部数据,*l读取单行数据
if response then
textmsg("收到服务器回复: " .. response)
-- 可根据内容进行判断
if response == "OK" then
textmsg("服务器确认收到信息。")
else
textmsg("服务器返回未知信息。")
end
else
textmsg("接收失败: " .. tostring(recv_err))
end
-- 关闭连接
client:close()
textmsg("已断开与服务器的连接。")
return response -- 返回服务器回复
end
-- 设置服务器 IP 和端口
local server_ip = "192.168.1.100"
local server_port = 8080
-- 要发送的消息内容,查看对应相机的通讯协议
local message = "Hello Server"
local response = send_and_receive(server_ip, server_port, message)
if response then
-- 可以根据返回内容继续处理
end
Modbus主站通讯,通过plc做为数据的中转站,将数据发送给plc,或收到PLC发送的数据
Modbus通讯参考:29 ARCS Modbus使用说明 · AUBO 应用笔记
--示例modbodbus主站读写浮点数 function writeModbusFloat(value, lowSignalName, highSignalName) local word = math.float2words(value) local low_word = word[1] local high_word = word[2] modbusSetOutputSignal(highSignalName, high_word) modbusSetOutputSignal(lowSignalName, low_word) end function readModbusFloat(lowSignalName, highSignalName) return math.words2float(modbusGetSignalStatus(lowSignalName), modbusGetSignalStatus(highSignalName)) end --示例modbus主站读取寄存器地址Modbus_0,Modbus_14的值,并赋值给变量P1,注意浮点数的读写需要占用两个寄存器地址 P1 = readModbusFloat("Modbus_0", "Modbus_1") --示例modbus主站寄寄存器地址Modbus_0,Modbus_1写入-3.14,注意浮点数的读写需要占用两个寄存器地址 writeModbusFloat(-3.14, "Modbus_0", "Modbus_1")
使用从站通讯(modbus从站与Profinet从站都可用),通过plc做为数据的中转站,将数据发送给plc,或收到PLC发送的数据
--从站通用寄存器读写浮点数 function writeModbusFloat(value, low, high) local word= math.float2words(value) local high_word=word[1] local low_word=word[2] setInt16Register(high, high_word) setInt16Register(low, low_word) end function readModbusFloat(low, high) return math.words2float(getInt16Register(high), getInt16Register(low)) end --示例从站往通用寄存器地址300,301写入-3.14,注意浮点数的读写需要占用两个通用寄存器地址 writeModbusFloat(-3.14, 0, 1) --示例从站读取通用寄存器地址300,301的值,注意浮点数的读写需要占用两个通用寄存器地址 P1=readModbusFloat(0, 1)
3. 偏移实现
通过自定义坐标系实现偏移
通过方向-直达节点实现偏移
0.31分支版本相对于变量或路点实现偏移