相机应用
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分支版本相对于变量或路点实现偏移

