相机应用
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 -- 可以根据返回内容继续处理 endModbus 主站通信,通过 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 分支版本相对于变量或路点实现偏移

