SCARA机械手 培训手册

Similar documents
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

上海盛瑞电子有限公司

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

chap07.key

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

F515_CS_Book.book

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

PowerPoint 演示文稿

OB1

计算机网络实验说明


Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

手册 doc

LETD型LED灯炮规格的更改

目录 1 IPv6 PIM Snooping 配置命令 IPv6 PIM Snooping 配置命令 display pim-snooping ipv6 neighbor display pim-snooping ipv6 routing-ta

Guava学习之Resources

8S E600Y 0773-CE

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

Microsoft Word - Delta Controller ASCII_RTU_SC

标题

数量关系部分题目溯源:

避孕篇

控制器 EtherCAT EtherCAT EtherCAT 接下一个电机驱动模块 (X4) 接下一个电机驱动模块 (X5) X11 IN X4 IN X3 OUT X5 IN X6 OUT X2 X1 X4 IN X3 OUT X5 IN X6 OUT X2 X1 SYS STA DC BUS D

untitled

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

化学实验基本操作-加热、干燥和冷却.doc

X713_CS_Book.book

瓦科-封面封底

1.加入党组织主要经过哪些程序?

untitled

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

《C语言程序设计》教材习题参考答案

《计算概论》课程 第十九讲 C 程序设计语言应用

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

PIC_SERVER (11) SMTP ( ) ( ) PIC_SERVER (10) SMTP PIC_SERVER (event driven) PIC_SERVER SMTP 1. E-

《C语言程序设计》第2版教材习题参考答案

FPGAs in Next Generation Wireless Networks WPChinese

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

通过Hive将数据写入到ElasticSearch

X-One 系统看穿式监管 V1.6.3 版本客户端及 API 使用相关说明

TD

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

幻灯片 1

Chapter #

Mohamed

Microsoft PowerPoint - 01_Introduction.ppt

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

路由器基本配置

CC213

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode]

Microsoft Word - 第3章.doc

_汪_文前新ok[3.1].doc

Converting image (bmp/jpg) file into binary format

專業式報告

untitled


IDEO_HCD_0716

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

目 录 第 五 部 分 第 六 部 分 第 七 部 分 第 八 部 分 投 标 邀 请 投 标 人 须 知 附 表 评 标 方 法 和 评 分 细 则 项 目 需 求 和 技 术 方 案 要 求 1

B1B1z_ch_print.pdf


付宝容器 jsapi 档 册 PDF 版本 本版本为实验版本, 为线下独 查看使, 受制于 成 PDF 程序的限制, 样式问题还没有很好的解决, 例如分 切图 代码 亮 推荐使 在线版本, 便实时查看 jsapi 运 效果 如需搜索, 使 阅读 PDF 软件 带功能即可 更多细节样式调整和 录索引探

本实验需要用到两个特征值, 两个特征值的属性各不相同, 我们同样在 SimpleGATTProfile 中新建即可, 接下来就开始吧 新建特征值表 : 表 3.3 串口透传特征值属性 长度 属性 UUID 功能 (byte) SIMPLEPROFILE_CHA R6 15 可读可写 FFF6 服务器

册子0906

Microsoft Word - install_manual-V _CN.docx

ChinaBI企业会员服务- BI企业

µ⁄∂˛’¬ µ˜ÕÍÀ≥–Ú_∏ƒ


KL DSC DEMO 使用说明

untitled


HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

ø8 ø10 ø12 ø16 AP LED LED AP8M 100V IDEC AP2M AP6M AP8M AP1M 6V DC 12V DC 24V DC 5V DC 12V AC/DC 24V AC/DC 6V DC 5% 12V DC 10% 24V DC 10% 6V AC/DC 5%

RxJava

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

数字带通 带阻 高通滤波器的设计 把一个归一化原型模拟低通滤波器变换成另一个所需类型的模拟滤波器, 再将其数字化 直接从模拟滤波器通过一定的频率变换关系完成所需类型数字滤波器的设计 先设计低通型的数字滤波器, 再用数字频率变化方法将其转换成所需类型数字滤波器

材 料 目 录 1. 党 员 发 展 及 转 正 流 程 图 2. 申 请 入 党 人 员 基 本 信 息 及 培 养 记 录 表 3. 思 想 汇 报 传 阅 及 意 见 反 馈 表 4. 入 党 积 极 分 子 培 养 考 察 表 5. 政 治 审 查 函 调 信 模 板 6. 政 治 审 查

Microsoft Word - MAN2023A_CH_APPONE.doc

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

正运动产品典型行业应用手册

(HMI) IO A

电子缝纫机 了解缝纫机 缝制基础知识 产品型号 : 885-V60/V61/V62/V63/V64/V65 实用针迹 附录 欢迎访问 常见问题解答 (FAQs) 在这里可以得到产品的支持和

Microsoft Word - VC2K_ _cht.doc

校园之星

领导,我不想写CSS代码.key

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

Title Unassigned.

K-HW508K / HW516K K-NL408K / NL416K 最新固件版本 :V G Seagate Pipeline HD2 ST CS - 可用 Seagate Pipeline HD2 ST1000VM002 - 可用 1T Seagate SV35.5

燃烧器电子控制系统 目录 2

PowerPoint 演示文稿

一量动…

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

山东建筑大学学分制管理规定(试行)

2014 年 87 月 259 日 K-HW508K / HW516K K-NL408K / NL416K 最新固件版本 :V3.200 容量 供应商 系列 型号 格式 可用性 兼容性能 备注 500G Seagate Pipeline HD2 ST CS - 可用 Seagate Pi

Microsoft Word - PHP7Ch01.docx

Transcription:

TURIN ROBOTICS SCARA 机械手培训手册 江苏图灵智能机器人有限公司 版本 V1.0

目录 一. 关于机械手的基础知识...3 1. 机械手主要机构... 3 2. 机械手坐标系... 3 3. 机械手的手臂姿势... 5 4. 机械手的负载... 5 二. 关于机械手的指令说明...6 1. 运动指令... 6 2. 变量操作... 6 三. 工艺介绍... 11 1. 码垛工艺... 11 2. 跟踪工艺... 14 四. 关于后台... 17 1. 后台使用... 17 2. 网络脚本设计... 18 五. 网络命令模块... 24 1.TCP/IP 通讯设计... 24 2. 命令包格式... 24 3. 命令介绍... 25 六. TURIN SCARA 机械手视觉应用...31 1. 程序案例... 31 2. 项目案例... 34 2

一. 关于机械手的基础知识 1. 机械手主要机构 2. 机械手坐标系 2.1 世界坐标 ( 直角坐标 ) 图 1-1 1: 前臂 2: 末端法兰 3: 后臂 4: 底座 5: 航插 6: 电缆 图 1-1 XY 方向 图 1-2 Z 方向 世界坐标系是系统默认的坐标系, 其坐标原点和坐标轴的指向在出厂时已经设置好, 示 教器界面当前位置显示的是丝杆末端的平面中心 2.2 关节坐标 图 1-5 当前坐标系设定为关节坐标系时, 按下 J1-J4 操作按键, 示教器操作机器人的 4 个轴正向 负向运动 3

图 1-6 表 1-1 SCARA 机械手各轴转动范围 各轴转动范围 型号 J1 轴 J2 轴 J3 轴 J4 轴 SCARA ±140 ±140 150mm ±360 2.3 用户坐标 用户坐标系的设定 (3 点法 ) 1. 确定需要的用户坐标系 2. 将带有操作工具的机器人移动到坐标系的原点, 并记录该点 3. 将带有操作工具的机器人移动到坐标系 X 轴上任意一点, 并记录该点 4. 将带有操作工具的机器人移动到 XY 平面内属于第一象限的任意一点, 并记录该点 5. 保存计算结果 2.4 工具坐标 坐标系定义在工具上, 由用户自己定义, 一般将工具的有效方向定义为工具坐标系的 Z 轴方向,X 轴 Y 轴方向按右手定则定义 图 1-7 工具示意图 4

TCP 标定方式 : 1. 检查机器人零位 DH 减速比 这些参数的准确性直接影响 TCP 的精度 2. 移出 2 轴零位, 避开奇异点, 将 RZ 调整至 0 弧度后工具尖端对准顶针尖端 ( 从这时 起顶针便不可移动 ), 记录下此时机器人直角坐标 (X1,Y1) 3. 在直角运动模式下, 将 RZ 调整至 3.14 弧度后, 再次对准顶针尖端, 记录下此时机器 人直角坐标 (X2,Y2) 4. 计算 = X2 X1 2 x,y 即工具坐标参数, 填入工具坐标系 3. 机械手的手臂姿势 = Y2 Y1 2 图 1-8 左手姿态和右手姿态机械手分为左手姿态和右手姿态 作业时, 其在某位置的姿态应尽可能跟示教时的姿态一致 否则, 会产生位置上的轻微偏移或者在意想不到的路径上运动 4. 机械手的负载 图 1-9 机械手的负载曲线 SCARA 机器人加载的负载必须符合 SCARA 机器人负载图, 负载的质量和自身惯量在各种情况下都要确认 超载将会使电机 减速机过载, 缩短机器人使用寿命, 严重情况可能损坏机器人 5

二. 关于机械手的指令说明 1. 运动指令 通常运动指令记录了位置数据 运动类型和运动速度 运动类型指定了在执行时示教点之间的运动轨迹 机器人一般支持 3 种运动类型 : 关节运动 (MOVJ) 直线运动(MOVL) 圆弧运动(MOVC) 添加运动指令需要按 使能 开关将驱动器使能 注意 : 除非特殊需要, 否则加速度需要跟速度设一样的百分比值! 1.1 关节运动类型 关节运动类型的特点是速度最快 路径不可知, 因此, 一般此运动类型运用在空间点上, 并且在自动运行程序之前, 必须低速检查一遍, 观察机器人实际运动轨迹是否与周围设备有干涉 1.2 直线运动类型 当机器人需要通过直线路径运动到当前示教点时, 采用直线运动类型 1.3 圆弧运动类型 当机器人需要通过圆弧路径运动到当前示教点时, 采用圆弧运动类型 圆弧运动类型对应的运动指令为 圆弧运动 ( 英文指令为 MOVC) 圆弧运动时需要三个运动点, 从当前点, 经过第一点 ( 辅助点 ), 到达第二点 ( 终点 ) 2. 变量操作 2.1 变量说明 1. 变量类型控制系统中有三种类型变量可以使用, 分别为数字变量 ( 浮点数 ), 字符变量 (1024 字节 ), 和坐标点变量 ( 分别保存空间和关节, 即两者间可以不存在运动学关系 ) 2. 变量作用域准确的说, 系统中有三种作用域变量, 分别为系统变量, 全局变量和文件变量 系统变量 : 系统变量生存周期随系统启 / 停而被创建和销毁 系统变量是整个系统内的共用变量, 即运动脚本与后台脚本程序可以同时使用的变量 系统变量不会因为哪个程序的启停而被系统初始化 即除非脚本或网络 ( 如 tcp server) 刻意修改, 否则系统变量永远都不会被系统更改 全局变量 : 全局变量的生存周期是随本次脚本程序的启停而创建和销毁 全局变量在本次启动的脚本内共用 即子文件与主文件之间共用 其他地方 ( 如前后台之间, 网络等都 ) 无法访问该变量 文件变量 : 也叫局部变量, 它的生存周期与全局变量一致, 不同在于, 它无法在主文件与各子文件之间共用 3. 变量的定义预定义的系统变量 : 1)V0~V999:1000 个系统数字变量, 需要注意的是, 为了书写方便,V0 V00,V000 表示同一个变量, 再如 V011 与 V11 也是同一个变量, 所有系统预设变量都如此, 不过为了 6

看起来舒服, 手动编程时候请尽可能使用 V000 的格式 2)S0~S999:1000 个系统字符变量 3)P0~P999:1000 个系统坐标点变量 预定义的文件变量 : 1)FV0~FV999:1000 个文件数字变量 2)FS0~FS999:1000 个文件字符变量 3)FP0~FP999:1000 个文件坐标点变量 注 : 之前有说过, 文件变量的作用域是单个文件, 即使名字相同, 即每主文件与每个子文件都有 FV,FS,FP 等各 1 千个 ( 共 3 千变量 ), 但它们之间也是无法共用的 相同变量使用各自的内存 4. 变量监视可以实时监控系统中变量内容的变化 当相应变量自动存储为开时, 系统时刻监视脚本中已经使用变量, 待其值发生变化时, 会立刻存储到文件 以便下次启动该脚本时使用已经变化的值 注 : 因为目前硬件系统并没有断电保护措施, 因此当程序运行时, 异常断电行为 ( 如拧电源 ) 有可能会出现刚刚更改的值未能即使存储到文件的现象 这点需要特别注意 7

2.2 关于数字 V 变量和使用 V 变量存储数字, 无论当做坐标来执行运动, 或者进行逻辑判断均可, 使用十分简单, 与 C 基本一致, 下面举出几个案例 1. 赋值 2. 自增 2.3 关于坐标点 P 变量使用 坐标点读取 修改在一些场合非常实用, 下面举出一些案例供参考 1. 获取当前位置后修改为常量 2. 获取当前位置后修改为变量 3. 读取出当前坐标点变量 4. 典型反面教材 注释 :1. 修改的 P 变量 存储的 P 变量 执行运动的 P 变量之间变量名要一致 2. 修改了直角坐标要用直线指令来执行运动, 反之亦然 8

3. 逻辑指令 3.1 跳转 若需跳转到 标记 0, 那么程序中必须有且只能有一个 标记 0 与其对应 3.2IF 条件语句 与 C 语言中 If 语句用法一致, 为嵌套结构 使用 If 语句时, 必须有 EndIf 做结尾,EndIf 和 ElseIf 不可单独使用 9

3.3WHILE 循环语句 本例中 (V950 < V951) 为循环条件表达式,While 与 ENDWHILE 之间语句为循环体 只 要满足 V950 < V951, 循环体语句便进行循环 3.4 关于 IO 的操作 行扩展 标准状态下有 12 组输入输出, 可供外部使用的有 6 组输入 10 组输出, 如需增加可进 程序中可按照类似此种方式使用, 用来控制继电器 电磁阀等吸合或进行一些简单的信 号交互非常方便 10

三. 工艺介绍 1. 码垛工艺 1. 工艺设置 在工艺 -> 码垛工艺 -> 码垛设置里设置码垛参数 a. 先设置正确的行数, 列数和层数 b. 设置放件原点坐标, 示教到上图 a 点位置, 然后点击 从当前位置复制 记录放件原点坐标 c. 依次记录上图 b, c, d 三点的坐标 ( 视情况不是三个点的坐标都要记录, 比如只有一行, 则 c 点无需记录 ; 如果只有一层, 则 d 点无需记录 ) 2. 程序编写 1) 一个码垛 # 先运动到任一码垛上方点, 获取该点坐标 ( 主要是得到夹具姿态 ) MJ(-18.996,11.798,2.627,-1.249,60.112,69.218,0.000,0.000,0.000,50,50,0,00,00)## 关节运动速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 GETCURPOINT(P1)## 获取当前位置到 P1 V0 = 0 ##V0 等于 0( 如果要从中间开始码垛, 把 0 修改为中间的值 ) 11

L0## 标记 0 PALLETINIT(01)## 码垛初始化参数 01 PALLETGETCURPOS(V0,V1,V2,V3)## 计算码垛放件点坐标当前执行垛数 V0 X 给 V1 Y 给 V2 Z 给 V3( 计算当前码垛放件点的 X,Y,Z 坐标 ) V4 = V3 + 100##V4 等于 V3 加 100 POINTSET(P1,2,1,V1)## 坐标点 P1 直角 X 改为 V1 POINTSET(P1,2,2,V2)## 坐标点 P1 直角 Y 改为 V2 POINTSET(P1,2,3,V4)## 坐标点 P1 直角 Z 改为 V4(P1 为放件准备点, 在放件点上方 100mm) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 POINTSET(P1,2,3,V3)## 坐标点 P1 直角 Z 改为 V3( 此时 P1 为放件点 ) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 SLEEP(1000)## 延时 1000 毫秒 POINTSET(P1,2,3,V4)## 坐标点 P1 直角 Z 改为 V4( 再运动到放件点上方 ) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 V0 += 1 ##V0 加等于 1( 码垛计数加 1, 准备处理下一个码垛点 ) IF(V0 > 49) ## 总垛数为 49 RETURN ## 当前码垛处理完毕程序结束 ELSE GOTO L0## 跳转到 L0 ENDIF 2) 两个码垛 # 先运动到任一码垛上方点, 获取该点坐标 ( 主要是得到夹具姿态 ) MJ(-18.996,11.798,2.627,-1.249,60.112,69.218,0.000,0.000,0.000,50,50,0,00,00)## 关节运动速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 GETCURPOINT(P1)## 获取当前位置到 P1 MJ(18.996,11.798,2.627,-1.249,60.112,69.218,0.000,0.000,0.000,50,50,0,00,00)## 关节运动速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 GETCURPOINT(P2)## 获取当前位置到 P2 V0 = 0 ##V0 等于 0 V0 为码垛 1 计数 V10 = 0 ##V10 等于 0 V10 为码垛 2 计数 L0## 标记 0 PALLETINIT(01)## 码垛初始化参数 01 PALLETGETCURPOS(V0,V1,V2,V3)## 计算码垛放件点坐标当前执行垛数 V0 X 给 V1 Y 给 V2 Z 给 V3( 计算当前码垛放件点的 X,Y,Z 坐标 ) V4 = V3 + 100##V4 等于 V3 加 100 POINTSET(P1,2,1,V1)## 坐标点 P1 直角 X 改为 V1 POINTSET(P1,2,2,V2)## 坐标点 P1 直角 Y 改为 V2 POINTSET(P1,2,3,V4)## 坐标点 P1 直角 Z 改为 V4(P1 改为放件准备点上方 100mm) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 12

POINTSET(P1,2,3,V3)## 坐标点 P1 直角 Z 改为 V3( 此时 P1 为放件点 ) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 SLEEP(1000)## 延时 1000 毫秒 POINTSET(P1,2,3,V4)## 坐标点 P1 直角 Z 改为 V4( 再运动到放件点上方 ) MLPC(P1,50,50,0,00,00)## 直线 PC 运动 P1 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 V0 += 1 ##V0 加等于 1( 码垛计数加 1, 准备处理下一个码垛点 ) IF(V0 > 49) ## 总垛数为 49 RETURN ## 当前码垛处理完毕程序结束 ELSE GOTO L1## 跳转到 L1 执行码垛 2 ENDIF L1## 标记 1 PALLETINIT(02)## 码垛初始化参数 02 PALLETGETCURPOS(V10,V11,V12,V13)## 计算码垛放件点坐标当前执行垛数 V10 X 给 V11 Y 给 V12 Z 给 V13( 计算当前码垛放件点的 X,Y,Z 坐标 ) V14 = V13 + 100##V14 等于 V13 加 100 POINTSET(P2,2,1,V11)## 坐标点 P2 直角 X 改为 V11 POINTSET(P2,2,2,V12)## 坐标点 P2 直角 Y 改为 V12 POINTSET(P2,2,3,V14)## 坐标点 P2 直角 Z 改为 V14(P2 为放件准备点, 在放件点上方 100mm) MLPC(P2,50,50,0,00,00)## 直线 PC 运动 P2 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 POINTSET(P2,2,3,V3)## 坐标点 P2 直角 Z 改为 V13( 此时 P2 为放件点 ) MLPC(P2,50,50,0,00,00)## 直线 PC 运动 P2 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 SLEEP(1000)## 延时 1000 毫秒 POINTSET(P2,2,3,V4)## 坐标点 P2 直角 Z 改为 V4( 再运动到放件点上方 ) MLPC(P2,50,50,0,00,00)## 直线 PC 运动 P2 速度 =50 加速度 =50 平滑 =0 工具 =00 用户 =00 V10 += 1 ##V10 加等于 1( 码垛计数加 1, 准备处理下一个码垛点 ) IF(V10 > 49) ## 码垛 2 总垛数为 49 RETURN ## 当前码垛处理完毕程序结束 ELSE GOTO L0## 跳转到 L0 执行码垛 1 ENDIF 13

2. 跟踪工艺 1. 硬件连接 下图为图灵编码器采集卡板间接线图 PWR: V100 型号电源 5VDC V200 型号电源 24VDC XP1,XP2: 增量型编码器接口 定义如上图 注意 : 因为编码器采用增量型, 所以要保证采集进来的信号保持增大, 若为减小可将 A 和 B 两根线互换位置 将网线从伺服驱动器第六轴 (SCARA 第四轴 )EtherCAT OUT 接到采集卡 T1, 将采集卡作为最后一个从站 当使用 1 个编码器时, 使用 XP1 视觉工控机网口与机器人的网口相连,( 若网口数量不够, 可通过交换机相连 ) 2. 跟踪工艺参数设置 14

说明 : 1 工作区开始位置: 当被检测物移动到该位置时, 机器人才开始动作 2 工作区结束位置: 当被检测物移动出该位置时, 机器人放弃当前跟踪物 3 光电开关位置: 检测开关的位置 以上位置均以跟踪原点坐标为零, 传送带运动方向为正 4 传送带移动比: 在启动文件夹 bin/ 目录下敲代码 : sudo./control halcmd show pin motmod.convey* 终端中会显示 <==SERVO_CONVEY_POS1 即为硬件 XP1 的当前脉冲数 将传送带移动一段距离, 实际测量出距离长度, 在敲一次该命令, 得到第二个脉冲数 两次脉冲数的差除以距离即为该比例 注意单位为脉冲数 / 毫米 5 光电触发输入: 光电开关接入的 DI 号 6 同时工作工件: 当需要触发两次有效时, 填写 2. 7 跟踪原点坐标: 可将机器人移动到合适位置可从当前位置复制过来 8 跟踪方向向量: 在传送带运动方向上去两个点, 以确定传送带运动方向 如上图所示, 可以现将机器人示教到 A 点, 点击方向点 1 在移动到 B 点, 点击方向点 2 再点计算即可 3. 指令说明 CONVEYTRACKSTART(X1) 传送带跟踪开始 X10,1 启动第几条传送带, 目前最多 2 条 CONVEYTRACKENABLE(X1,X2,X3) 传送带后台运行使能, 一旦停止下来会全部清除 X1 0,1 启动第几条传送带后台运行, 目前最多 2 条 X2 把几号 IO 映射给这条传送带 X3 这条传送带每次输入几个触发 CONVEYTRACKEND() 传送带跟踪结束, 会等待减速至停下来才执行下条指令 CONVEYTRACKWAIT (X1) 传送带等待有物料进入拾取区 X10,1 启动第几条传送带, 目前最多 2 条 CONVEYTRACKSET (X1,X2) 传送带设置指令, 需要在启动跟踪之前设置, 让传送带知道自己如何运行 X1 当前传送带设定为第几号传送带保存的参数 (X1-1 对应界面工艺号 ) X2 当前传送带加速度的百分比 15

4. 程序案例 ML(25.991,80.909,-43.839,-1.735,0.000,0.000,0.000,0.000,0.000,100,100,0,02,00)## 直线运动速度 =100 加速度 =100 平滑 =0 工具 =02 用户 =00 L0## 标记 0 CONVEYTRACKENABLE(0,7,1)## 跟踪使能 (0,7,1) CONVEYTRACKSET(0,5)## 跟踪设置 (0,5) CONVEYTRACKWAIT(0)## 跟踪等待 (0) CONVEYTRACKSTART(0)## 传送带跟踪开始参数 00 ML(18.164,90.364,-90.144,-19.537,0.000,0.000,0.000,0.000,0.000,100,100,0,02,00)## 直线运动速度 =100 加速度 =100 平滑 =0 工具 =02 用户 =00 IOOUT(02,1)##I/O 输出 02=ON ML(18.164,90.364,-98.981,-19.544,0.000,0.000,0.000,0.000,0.000,100,100,0,02,00)## 直线运动速度 =100 加速度 =100 平滑 =0 工具 =02 用户 =00 ML(18.164,90.364,-90.144,-19.538,0.000,0.000,0.000,0.000,0.000,100,100,0,02,00)## 直线运动速度 =100 加速度 =100 平滑 =0 工具 =02 用户 =00 CONVEYTRACKEND()## 传送带跟踪结束 MJ(-39.421,69.025,-43.851,-16.845,0.000,0.000,0.000,0.000,0.000,100,100,0,02,00)## 关节运动速度 =100 加速度 =100 平滑 =0 工具 =02 用户 =00 IOOUT(02,0)##I/O 输出 02=OFF SLEEP(200)## 延时 200 毫秒 MJ(-13.986,69.023,-43.851,-16.852,0.000,0.000,0.000,0.000,0.000,100,100,100,02,00)## 关节运动速度 =100 加速度 =100 平滑 =100 工具 =02 用户 =00 GOTO L0## 跳转到标记 0 16

四. 关于后台 1. 后台使用 1.1. 后台程序编辑新系统设计与开发还在进行中 其中后台程序的编辑器需要使用外部编辑工具编辑.txt 文件 编辑好以后拷贝到 /home/thinkrob/.turin/backprogram 文件夹下 拷贝方式有两种,1 是使用 cp( 命令 ),2 是使用文件管理器 1.2. 后台程序配置监视 / 控制 -> 后台程序 -> 启停配置下可以配置 16 组后台程序 开关 : 开关是总开关, 即是否启用本后台程序线程 运动程序 : 运动程序可以控制后台程序的启停状态 当后台程序线程设定了运动程序时, 系统会在运动程序运行时启动后台程序 而当运动程序停止时停止后台程序, 即后台程序与运动程序同步启停 当未设置运行程序时, 后台程序会随系统启停而启停 后台程序 : 指明本后台程序线程运行的主后台程序 1.3. 后台程序编写后台程序与运动程序在执行时有所不同 后台程序会被系统反复调用的 如有一条自增指令 V0++ 该指令在作为运动程序执行时仅自增一次 而在后台程序中会不断被调用, 也就是不断自增 因此后台程序运行 V0++ 与运动程序执行 WHILE(1):V0++:ENDWHILE 效果一致 当然在后台程序中执行 WHILE(1):V0++:ENDWHILE 也是允许的 17

2. 网络脚本设计 2.1 网络通讯函数介绍 1. int SocketServerInit(int) 功能 : 初始化网络服务器, 参数 1: 端口号 返回值 : 执行成功返回服务器监听 socket id, 即套接字 失败返回 -1 2. int SocketServerAccept(int) 功能 : 监听客户端连接参数 1:socket id 返回值 : 执行成功返回客户端 socket id, 失败返回 -1 3. int SocketClientInit(string,int) 功能 : 连接到服务器参数 1:ip 地址参数 2: 端口号返回值 : 成功返回客户端 socket id, 失败返回 -1 4. voidsocketclose(int) 功能 : 关闭套接字参数 1:socket id 返回值 : 无 5. int SocketWrite(int,string) 功能 : 发送数据参数 1:socket id 参数 2: 字符串, 发送长度为字符串长度, 注意不带 \0 返回值 : 成功返回发送长度, 失败返回负数 6. int SocketWrite(int,string,int) 与 5 不同, 可以指定发送的长度, 在参数 3 7. int SocketRead(int,string,int) 功能 : 接收数据参数 1:socket id 参数 2: 存储缓冲区 ( 字符串变量 ) 参数 3: 读取长度, 目前最大 1024, 给更大值也无济于事返回值 : 成功返回读取长度, 失败返回 0 或负数 注意, 这是一个阻塞函数, 除非出错, 否则会一直等待 适合接收握手报文 8. int SocketReadLine(int,string,int) 功能 : 读取一行字符串 参数 1:socket id 参数 2: 存储缓冲区 ( 字符串变量 ) 参数 3: 超时时间返回值 : 成功返回读取长度, 失败, 超时返回 0, 网络异常返回负数设计细节 : 所有网络接口均使用非阻塞套接字实现, 如 SocketRead 与 SocketReadLine 也是如此, 所有的阻塞现象都是脚本模拟出来的 因此并不会影响其他脚本执行 网络收发缓冲区暂时设定为 4M 大小 18

2.2 其他相关函数 1 即使对于脚本来说, 网络通讯也总是作为一个基础功能来用 最终功能还是需要一些数据处理函数来完成 控制器中支持的数据 ( 主要就是字符串 ) 处理函数还很少 先介绍几个 1 格式化类型函数 : 1)Sprintf: 不多说了, 与 C 基本一致 2)StrToDig: 将字符串变量转为数字变量 3)DigToStr: 将数字变量转为字符串变量 4)Replace: 字符串切割并重组函数其使用了正则表达式, 对于不熟悉正则表达式来讲是一个比较烧脑的函数, 有两个原型 void Replace(string,string,string,string) void Replace(string,string,string,digital) 功能, 将一个输入字符串根据正则表达式来分割, 并根据新的格式生成新的字符串 参数 1: 输入字符串, 即要分割的字符串参数 2: 正则表达式, 即分割规则参数 3: 重组表达式 : 即重组规则参数 4: 存储处理结果, 可以是字符串或数字变量, 以后计划加入坐标点变量返回值 : 无, 处理失败参数 4 得不到结果 简单介绍一下这个函数的使用假如有字符串 4.5-5.98 +7.69, 想给它改成 X=4.5 Y=-5.98 Z=+7.69,Replace 就能做到 写法是 Replace( 4.5-5.98 +7.69, (.*) (.*) (.*), X=\\1 Y=-\\2 Z=\\3,S1) 解释一下, 参数 2 中的任意一个 (.*) 可以截取任意长度的任意字符, 多说点, 提取浮点数的话这样写是不严谨的 写成 ([+-]?(\\d.\\d \\d)) 会更严谨点 既然是例子就写的简单点吧 我们的目的是使用 3 个 (.*) 来截取参数一中的每一个浮点数 参数 1 中每一个浮点数之间使用空格隔开 因此我们使用 (.*) (.*) (.*) 这样的表达式来切割参数 1 参数 3 的 \\+ 数字 的写法是表示引用参数 2 的哪一组括号 ( 切割结果 ) 括号的顺序是从左往右查找先出现的左括号 ( 如 ((a)b), 那么括号 2 是 ab, 括号 2 是 a ) 注意例子中引用括号时是从 1 开始的 不过 \\0 也是有意义的, 它表示整个参数 1, 即输入字符串 如果匹配成功, 结果会存储在变量 S1 中 值得一提的是, 这个函数也可以在运动文件中使用, 稳定性有待长期运行测试 2, 切割函数 :RegScanfD 与 RegScanfS, 末尾字符 D 代表切割成数字, 末尾字符 S 代表切割成字符串, 定义如下 : int RegScanfD(string,string...) int RegScanfS(string,string...) 这是一个变长函数 参数 1: 输入字符串参数 2: 正则表达式参数 3~n: 存储括号 0~n 的结果返回值 : 执行成功返回 0, 错误返回 -1 与网络参数一样, 该函数只能在后台中使用 举例 : 继续沿用 Replace 的字符串, 这次目的是把 4.5-5.98 +7.69 中的三个浮点数放到变量 V1,V2,V3 中 19

写法是 :RegScanfD( 4.5-5.98 +7.69, (.*) (.*) (.*),0,V1,V2,V3) 参数 1 与参数 2 前面已经解释过了, 我们知道括号 1~3 存储了三个浮点数 我们还知道括号 0 存存储整个参数 1 那么 RegScanf 的变长参数部分就可以存储错号 0~3 的结果 但是, 括号 0 的结果我们一般不需要用, 因此参数 3 可以给个 0,RegScanfS 的话需要给 运行结果 :V1=4.5,V2=-5.98,V3=+7.69 2.3 其他相关函数 2 再列举两组函数吧 : 1. 获取关节位置 digital J1(), digital J1 digital J2(), digital J2 digital J3(), digital J3 digital J4(), digital J4 digital J5(), digital J5 digital J6(), digital J6 digital J7(), digital J7 digital J8(), digital J8 digital J9(), digital J9 2. 获取空间位置, 注意是世界坐标系 digital X(), digital X digital Y(), digital Y digital Z(), digital Z digital RX(), digital RX digital RY(),digital RY digital RZ(), digital RZ 每一行的两个函数作用一致, 注意后面的函数没有括号了, 很像变量, 以后这样的函数会更多 20

2.4 网络脚本用例 1. 机器人客户端程序 DEFINE ERR 1 # DEFINE WARN 2 # DEFINE INFO 3 # DEFINE DBG 4 # # 假设这是控制器接收视觉识别信息模块 WHILE(1) SLEEP(2000) DIGITAL ClientFD = 0 ClientFD = SocketClientInit("192.168.10.11",8000) # 连接视觉服务器 IF(0 > ClientFD) PrintMsg(ERR,"SocketClientInit 执行失败 %d\n",clientfd) RETURN ENDIF PrintMsg(INFO," 已连接到服务器 %d\n",clientfd) WHILE(1) SLEEP(1000) # 2 秒触发一次 STRING Buf DIGITAL Size = 0 Size = SocketWrite(ClientFD,"GetPos") IF(0 > Size) PrintMsg(ERR,"SocketWrite 执行失败 %d\n",size) BREAK ENDIF DIGITAL Index = 0 WHILE(1) Size = SocketReadLine(ClientFD,Buf,1000) IF(0 > Size) PrintMsg(ERR,"SocketRead 执行失败 %d\n",size) BREAK ELSEIF(0 == Size) PrintMsg(INFO,"SocketRead 读取 %d 长度 \n",size) BREAK ENDIF DIGITAL RETVAL = 0 RETVAL = RegScanfD(Buf,"(.*) (.*) (.*)\\n?",0,v12,v13,v14) IF(0 > RETVAL) PrintMsg(ERR,"RegScanfD 执行失败 %d\n",retval) CONTINUE ENDIF PrintMsg(INFO,"Line %d: %.3f %.3f %.3f \n",++index,v12,v13,v14) ENDWHILE 21

ENDWHILE SocketClose(ClientFD) ENDWHILE 2. 机器人服务器程序 DEFINE ERR 1 # DEFINE WARN 2 # DEFINE INFO 3 # DEFINE DBG 4 # # 假设这是视觉服务器 DIGITAL ServerFD = 0 ServerFD = SocketServerInit(8988) IF(0 > ServerFD) PrintMsg(ERR,"SocketServerInit 执行失败 %d\n",serverfd) RETURN ENDIF PrintMsg(INFO," 视觉服务端已建立 %d\n",serverfd) WHILE(1) DIGITAL ClientFD = 0 PrintMsg(INFO," 等待客户端连接 \n") ClientFD = SocketServerAccept(ServerFD) IF(0 > ClientFD) PrintMsg(ERR,"SocketServerAccept 执行失败 %d\n",serverfd) RETURN ENDIF PrintMsg(INFO," 客户端已链接 %d\n",clientfd) WHILE(1) SLEEP(1) STRING Buf DIGITAL Size = 0 Buf = "" Size = SocketRead(ClientFD,Buf,0) # 等待客户端发送任意长度命令 IF(0 > Size) # 小于 0 一般表示连接断了 PrintMsg(ERR,"Server: SocketRead 执行失败 %d\n",size) BREAK ENDIF PrintMsg(INFO," 收到命令 %s\n",buf) IF(Buf!= "GetPos") # 只接受客户端发来的这个命令 Size = SocketWrite(ClientFD,"CmdErr") IF(0 > Size) PrintMsg(ERR,"SocketWrite 执行失败 %d\n",size) BREAK ENDIF CONTINUE # 返回等待下一个命令 22

ENDIF Sprintf(Buf,"%.3f %.3f %.3f %.3f %.3f %.3f\n%.3f %.3f %.3f %.3f %.3f %.3f",X,Y,Z,RX,R Y,RZ,J1,J2,J3,J4,J5,J6) # 空间和关节都发过去了, 注意中间有个换行符, 这类似与视觉一起发两组坐标 Size = SocketWrite(ClientFD,Buf) IF(0 > Size) PrintMsg(ERR,"SocketWrite 执行失败 %d\n",size) BREAK ENDIF # 这个命令处理完了 ENDWHILE SocketClose(ClientFD) #BREAK 到这里, 应该关闭一下 ENDWHILE SocketClose(ServerFD) 3.TCP/IP 机器人做客户端, 前台脚本的写法 变量解读 : V99 一旦与服务器通讯成功便会跳出循环 V101=1 会发送拍照指令该指令可在后台文件中修改, 改成想要发送的字符串 V12 先置为 -2 收到数据之后会置 1, 然后跳出循环 V100=1 发送机器人当前位置 23

五. 网络命令模块 1.TCP/IP 通讯设计 本模块作为运动控制器的 TCP/IP 网络服务器端等待客户端连接 本控制器支持多客户端连接同时接入 连接数量为 Linux 允许的单进程最大网络连接数 ( 目前 256 个 ) 所有连接的网络客户端可以同时与运动控制器收发数据 TCP 服务器端端口号为 8527 高版本中在网络服务器界面设置 : 低版本中 2. 命令包格式 在介绍命令格式之前, 有一点需要明确 运动控制器是在 Linux 下开发 使用的是 UTF-8 字符集 ( 如果需要支持中文的话 ) Linux 下换行不是 \r\n, 只是 \n, 这点需要特别注意 控制器命令服务器命令包格式为 XML: <Cmd Name= XXX Status= Send /> 24

3. 命令介绍 本模块暂时支持以下命令, 具体介绍如下 : 1) Login 命令, 后续的很多命令都要求先登录 <Cmd Name="Login" Status="Send"><Param UserName = "administrator" Password="12345678"/> 控制器返回 : <Cmd Name="Login" Status="Recv"> <Param Password="12345678" UserName="administrator"/> <Data>OK</Data> 2) Logout 命令 <Cmd Name="Logout" Status="Send"/> 控制器返回 : <Cmd Name="Logout" Status="Recv"> <Data>OK</Data> 3) GetCurPos 命令, 返回机器人当前的世界坐标值 <Cmd Name="GetCurPos" Status="Send"/> 控制器返回 : <Cmd Name="GetCurPos" Status="Recv"> <Data>900.5000,0.0000,1188.0000,0.0000,0.0000,0.0000,-0.0000,-0.0000,0.0000 </Data> 4) GetMotionStatus 命令, 获取机器人运行状态 25

<Cmd Name="GetMotionStatus" Status="Send"/> 控制器返回 : <Cmd Name="GetMotionStatus" Status="Recv"> <Data>motion status = stoped motion exec line = 1 </Data> Motion status 可能为 running,stopping,stopped,error Motion exec line 为脚本当前运行的行号 5) MotionBegin 命令, 用于启动运动 机器人需在自动模式下才能启动运动 <Cmd Name="MotionBegin" Status="Send"> <!-- BeginMotion 在 motion 目录下执行文件开始行给一个 0, 保证总是从第一行执行 --> <Param FileName = "Main.txt" StartLine = "0"/> <Data>MoveL(xxxx)</Data> <!--Data> 这里可以加文件内容的, 会覆盖之前的文件内容 </Data--> 控制器返回 : <Cmd Name="MotionBegin" Status="Recv"> <Param FileName="Main.txt" StartLine="0"/> <Data>OK</Data> 6) MotionEnd 命令, 停止运动 <Cmd Name="MotionEnd" Status="Send"/> 控制器返回 : <Cmd Name="MotionEnd" Status="Recv"> <Data>OK</Data> 26

7) LoadFile 命令, 让控制器加载 ( 打开 ) 某个脚本文件 <Cmd Name="LoadFile" Status="Send"> <Param FileName="Main.txt"/> 控制器返回 : <Cmd Name="LoadFile" Status="Recv"> <Param FileName="Main.txt"/> <Data>OK</Data> 8) ReadDir 命令, 读取控制器工作目录下某个目录下所有的文件列表 <Cmd Name="ReadDir" Status="Send"> <Param Filter="*.txt" Dir="./motion"/> 控制器返回 : <Cmd Name="ReadDir" Status="Recv"> <Param Filter="*.txt" Dir="./motion"/> <Data>0306.txt 0_welding.txt 20180327.txt 999999Program11.txt</Data> 9) ReadConfigFile 命令, 读取某个配置文件的某个键值 <Cmd Name="ReadConfigFile" Status="Send"> <Param FileName="joint.ini" Sec="JOINT1" Key="red" /> 控制器返回 : <Cmd Name="ReadConfigFile" Status="Recv"> 27

<Param FileName="joint.ini" Key="red" Sec="JOINT1"/> <Data>120</Data> 10) WriteConfigFile 命令, 写入某个配置文件的某个键值 <Cmd Name="WriteConfigFile" Status="Send"> <Param FileName="joint.ini" Sec="JOINT1" Key="red" Value="240" /> 控制器返回 : <Cmd Name="WriteConfigFile" Status="Recv"> <Param FileName="joint.ini" Key="red" Sec="JOINT1" Value="240"/> <Data>OK</Data> 11) LoadConfigFile 命令, 加载所有的配置文件 <Cmd Name="LoadConfigFile" Status="Send"/> 控制器返回 : <Cmd Name="LoadConfigFile" Status="Recv"> <Data>OK</Data> 12) ReadFile 命令, 读取某个文件的内容 <Cmd Name="ReadFile" Status="Send"> <Param FileName="./motion/Main.txt" /> 控制器返回 : <Cmd Name="ReadFile" Status="Recv"> <Param FileName="./motion/Main.txt"/> <Data>Sleep(8000)</Data> 28

13) WritFile 命令, 写入某个文件 <Cmd Name="WriteFile" Status="Send"> <Param FileName="./motion/Main.txt" /> <Data>Sleep(18000)</Data> 控制器返回 : <Cmd Name="WriteFile" Status="Recv"> <Param FileName="./motion/Main.txt"/> <Data>OK</Data> 14) RemoveFile 命令, 删除某个文件 <Cmd Name="RemoveFile" Status="Send"> <Param FileName="./motion/Main.txt" /> 控制器返回 : <Cmd Name="RemoveFile" Status="Recv"> <Param FileName="./motion/Main.txt"/> <Data>OK</Data> 15) Variable 命令, 读写变量 <Cmd Name="Variable" Status="Send"> <Data>V1-V10</Data> 控制器返回 : <Cmd Name="Variable" Status="Recv"> 29

<Data>V001 = 0.0000 V002 = 0.0000 V003 = 0.0000 V004 = 0.0000 V005 = 0.0000 V006 = 0.0000 V007 = 0.0000 V008 = 0.0000 V009 = 0.0000 V010 = 0.0000 </Data> 该命令支持其他的操作如下 : <!-- 都是用正则写的, 等号和变量两侧的空格 ( ) 符随便加 --> <Cmd Name="Variable" Status="Send"> <Data> <!-- 这是获取变量值, 就是只有变量名, 不跟等号和值的写法 可以用 : 或者 \n 隔开 --> S6:V2:S7 <!-- 这是批量获取变量值, 中间是减号, 这个写法类似正则 大小顺序不用管, 自动转换 --> S0-S7:V9-V0 <!-- 这是赋值,V 变量检测了其有效性质, 不是 int 或 double 写法不认 --> V101=-1.1:V100 = +48.98 <!-- 这是赋值, 字符串要加双引号, 方便获取空格等空白符 --> S6 = " 157" : S8 = "" <!-- 这是批量赋值, 这个用法意义是, 用作批量初始化 --> V0-V100 = 0 S100-S1 = "no value" <!-- 这是控制 IO 输出 --> <Cmd Name="Output" Status="Send"> <Data>DO0-DO11</Data> </Data> 30

六.TURIN SCARA 机械手视觉应用 1. 程序案例 1.1 单视觉定点抓取 (1) 后台配置 (2) 前台脚本 31

(3) 后台脚本 (4) 解析本例为定点抓取, 机器人做客户端, 视觉做服务器 案例中后台脚本只展示了接收数据的部分, 可根据实际需求进行修改 IP 地址与端口号设置好后, 保存后台程序, 便会与视觉服务器建立连接 实际使用中用到了 4 位数据, 分别存储在 V20,V21,V22,V23 中 第一位 V20 代表视觉识别的结果, 数字 0 代表视觉识别失败,1 代表成功识别 这样一来如果视觉 NG, 便可自动重新索取数据 根据实际需求, 还可以在程序中增加计数程序, 这样当重新索取一定次数之后, 视觉仍然 NG 时, 便可控制机械手输出一个报警信号, 此时再进行人为干预, 会大大省去人工操作的精力 V21,V22,V23 这三个变量中存储被识别物体的 X,Y,U 使用这三个变量进行 P 点运动的指令, 便可使机械手以正确的姿态运动到物品上方, 然后即可进行需要的动作 32

1.2 单视觉跟随抓取 ( 硬触发拍照 ) (1) 工艺设置 (2) 前台脚本 (3) 解析跟踪工艺的设置参考之前的说明 视觉工艺与跟踪一同应用时, 不使用后台, 在工艺界面设置好服务器的 IP 地址和端口号 如果设置无误, 在前台界面运行视觉初始化便会与服务器建立连接, 反之运行视觉退出便会断开连接 带视觉的跟踪是由视觉发送的信息进行触发 一般情况下, 机械手需要接收 4 位数据, 跟上一个案例有些相似 存储位置在跟踪使能指令 CONVEYTRACKWAIT(0,V1,V2,V3) 中体现, 该指令中的变量地址不可修改, 并且第一位数为 1 的时候才会存储 以上文案例程序进行总结 在流水线始终开启的状态下, 从程序第一行开始自动运行后, 程序会停留在第七行跟踪使能的位置, 这时候机械手等待视觉识别的信息发送过来 假设物品位置信息为 X=100,Y=200,U=30, 那么视觉需发送 1,100,200,30 且机械手能成功接收, 这时跟踪便会开始, 程序自动顺序执行 33

2. 项目案例 1. 单视觉双机械手流水线协同下料 简介 : 大型冲压机对工件进行冲压作业, 产品随机散落在流水线上, 角度随机 间距大致相等, 两台机械手分别对奇数号产品和偶数号产品进行精准抓取与定位摆放 配合料盘自动化装置完成自动下料工序 该项目难点在于要在运动过程中进行随机抓取, 机械手的在线跟踪工艺可以完成对于产品的同步跟随, 同时通过 TCP/IP 通信的方式与视觉进行信息交互, 实现对产品角度 位置的校准, 这样抓取的位置便可准确 与基于 PLC 控制的料盘流水线, 通过 IO 信号配合运转, 当机械手内部计数程序判定当下料盘已经摆满后,PLC 便会控制流水线动作来更换料盘 2. 基于自动上下料机械手的灯壳自动涂胶系统 简介 : 两台 SCARA 机械手, 配合 PLC 进行上料 涂胶 下料协同作业 两台机械手中间是有八个工位的分割器 灯壳由自动送料机构无规则地送至上料流水线, 上料机器人需通过视觉进行引导, 从流水线抓取至分割器固定工位中 涂胶完成后, 再由下料机器人进行下料 该项目信号比较繁杂, 输入信号有分割器动作 两个工位物料检查 流水线物料检查等的信号, 一旦动作完成 测得次品 视觉 NG 系统报警等机械手也会给出相应的输出信号 最终, 就算过程中有人为干预, 机械手也不会出现误抓 漏抓的情况 34

3. 单视觉 SCARA 机械手 LCD 屏定位抓取 简介 : 上料机构将 LCD 屏随机摆放于流水线上, 机械手需根据屏幕种类, 分类并准确的抓取并摆放到自动下料装置中 流水线在线跟踪加视觉 由于项目中屏幕种类较多, 在机械手中需添加种类分辨程序, 根据视觉识别信息准确抓取产品后, 放入相应的位置 4. 双视觉流水线跟随键盘贴片 简介 : 自动送料装置将键盘外壳送至流水线上, 机械手去一侧取贴片材料, 至下相机处拍照后调整贴片材料姿态, 进入到等待位 键盘壳进入工作区间后, 上相机拍照, 识别贴片位置, 机械手随后完成贴片动作 一台机器人配合两个视觉进行在线跟踪 下相机校准贴片姿态的只是常规的抓取, 上相机识别键盘壳, 还要将识别信息作为跟随开始的触发信号 机械手中建立两个端口, 分别用来接收两个视觉发送的信息 再通过工艺设定, 将其中一个用来触发跟踪 35