相机应用

1. 通讯介绍

目前机械臂和视觉设备(相机)通讯,有两种方式:

  1. 机械臂与相机通过TCP/IP通信,通过在程序树添加 lua 脚本触发相机拍照并获取数据,获取的数据类型有两种含义:

​ (1)机械臂直接获取需要的目标点位----绝对坐标;

​ (2)机械臂获取需要偏移的距离----相对坐标;

  1. 相机与 PLC 连接并触发拍照,PLC 与机械臂通过 Modbus、Profinet等通讯协议进行通讯, 拍照后由PLC把需要偏移的数值发给机械臂,根据相对位置进行X 、Y、RZ的偏移。

2. ARCS中相机通讯的方式

  1. ARCS中可以使用socket通信来实现机器人与相机的TCP/IP通讯,在AUBO开发者官网中提供了相关示例

    应用示例 | 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

伟景相机通讯示例(仅供参考)

  1. Modbus主站通讯,通过plc做为数据的中转站,将数据发送给plc,或收到PLC发送的数据

    Modbus通讯参考:29 ARCS Modbus使用说明 · AUBO 应用笔记

    modbus主站读写寄存器浮点数.lua

    --示例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")
    
  2. 使用从站通讯(modbus从站与Profinet从站都可用),通过plc做为数据的中转站,将数据发送给plc,或收到PLC发送的数据

    从站读写通用寄存器浮点数.lua

    --从站通用寄存器读写浮点数
    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. 偏移实现

  1. 通过自定义坐标系实现偏移

    参考示例:40 视觉偏移示例 · AUBO 应用笔记

  2. 通过方向-直达节点实现偏移

  3. 0.31分支版本相对于变量或路点实现偏移

results matching ""

    No results matching ""