【睿尔曼-RealMan】睿尔曼复合机器人产品配件-Modbus-RTU末端执行器实训手册
Ron 2024-04-30
一、接线与选配要求
1.机械臂末端的通讯方式,适配介绍
(1)对外供电
机器人末端可对外输出 5V/12V/24V 电源(当输出 24V 电压时,实际输出电压与机器人电源电压一致,若电源电压不稳定,输出电压会受到影响),电源输 出类型可通过示教器或者 JSON 协议进行配置和控制通断,电气特性如下表所示:
注意:在通过末端电源为末端工具进行供电时,参考上表电流参数限制,以防过载,烧毁末端接口板。
(2)通讯接口
机械臂末端接口板 6 芯航插处,有 1 路 RS485 通讯接口(仅用于机器人控制外部设备,不支持外部设备进行机器人运动控制), 这一组 RS485 端口可通过 JSON 协议配置为标准的 Modbus RTU 模式。通过 JOSN 协议对端口连接的外设进行读写操作(详细指令参数介绍参考如下机械臂访问末端执行器寄存器地址)。
(3)负载能力
以Rm65-b机械臂为例,额定末端负载5kg,额定负载=末端实际物品重量+末端工具重量+转接件重量。客户可根据实际情况来进行末端工具的选配。
2.线序介绍,接线方式配合实际操图片
为方便用户在机器人末端添加工具,在协作机器人末端的工具法兰旁边有一个 6 针的连接器,它为连接到机器人的不同夹持器和传感器提供电源和控制信号。同时在法兰外壳上有两个按钮,分别控制机器人进行拖动示教和轨迹复现。 注意:在插拔末端接口板的航插线缆时,请确保末端的电源输出处于关闭状 态,否则有造成硬件损坏的风险!插入航插时请用户务必保证插针与孔位对齐,并检查插针是否正常。
接口板的功能接口如下表所示:
末端工具接口通过 1 个 6 芯航插对外连接,航插引脚及定义如下图所示。
备注:上表中的复用功能通过程序指令进行切换。出厂时默认引脚 3 和引脚 4 为数字输入通道(DI1 和 DI2),引脚 6 的电源输出为 0V(可通过程序设置)。
3.测试通断
首先,需要准备一个万用表,如图所示。
红表笔接入欧姆表和电压表的位置,如图所示。
调节旋钮到欧姆测通挡位,然后双表笔接触,会发出滴滴的响声就可以进行接线的通断测试。
通断测试将表笔分别接入上述根据睿尔曼智能科技提供的航插接线的针脚的一端以及根据型号选配的末端工具的对应的航插针脚的一端,测试线序的选择的就是我们接线的线序,直至听到滴滴响声,每根线路都是需要测试通断完成后。证明电路线序是正确的后就可以进行末端工具和机械臂的连接。
二、MODBUS-RTU详解以及基础应用
1. MODBUS-RTU协议介绍
Modbus是一种串行通信协议, Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。Modbus RTU(远程终端模式)是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。这两个变种都使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
MODBUS只是通信协议的一种,就像汉语和英语一样的一种用来交流的语言,一种机器之间交流的语言。在交流之前肯定要有沟通的桥梁,那就是传输媒介485或232或其他电气规则。同一种协议可以用不同的传输媒介方式如485或232,但是同一传输线路上不能同时存在两种协议。
2.机械臂访问末端执行器寄存器地址
睿尔曼机械臂在控制器的航插和末端接口板航插处,各有 1 路 RS485 通讯接口,这个 RS485 端口可通过 JSON 协议配置为标准的 ModbusRTU 模式。然后通过 JOSN 协议对端口连接的外设进行读写操作。
注意:控制器的 RS485 接口在未配置为 Modbus RTU 模式的情况下,可用于用户对机械臂进行控制,这两种模式不可兼容。若要恢复机械臂控制模式,必须将该端口的 Modbus RTU 模式关闭。Modbus RTU 模式关闭后,系统会自动切换回机械臂控制模式,波特率 460800BPS,停止位 1,数据位 8,无检验。同时,I 系列控制器支持 modbus-TCP 主站配置,可配置使用 modbus-TCP主站,用于连接外部设备的 modbus-TCP 从站。
对应的json协议如下所示:
功能描述 | 配置通讯端口 ModbusRTU 模式,机械臂启动后,要对通讯端口进行任何操作,必须先启动该指令,否则会返回报错信息。 另外,机械臂会对用户的配置方式进行保存,机械臂重启后会自动恢复到用户断电之前配置的模式。 |
---|---|
参数说明 | set_modbus_mode:配置端口ModbusRTU 模式 |
命令格式 | {s:s,s:i,s:i,s:i} |
示例 | {"command":"set_modbus_mode","port":0,"baudrate":115200,"ti meout":1} |
说明 | port:通讯端口,0-控制器RS485 端口为 RTU 主站,1-末端接口板RS485 接口为RTU 从站,2-控制器RS485 端口为RTU 从站 baudrate:波特率,支持 9600,115200,460800 三种常见波特率 Timeout:超时时间,单位百毫秒。对 Modbus 设备所有的读写指令,在规定的超时时间内未返回响应数据,则返回超时报错提醒。超时时间不能为 0,若设置为 0,则机械臂按 1 进行配置。 其他配置默认为:数据位-8,停止位-1,奇偶校验-无 |
返回值 | {"command":"set_modbus_mode","set_state":true}设置成功 {"command":"set_modbus_mode","set_state":false}设置失败 |
(2)关闭通讯端口 ModbusRTU 模式
功能描述 | 关闭通讯端口ModbusRTU 模式 |
---|---|
参数说明 | close_modbus_mode:关闭端口ModbusRTU 模式 |
命令格式 | {s:s} |
示例 | {"command":"close_modbus_mode","port":0} |
说明 | 关闭后,该端口将不会响应任何读写指令的操作 port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,2-控制器RS485 端口为RTU 从站 |
返回值 | {"command":"close_modbus_mode","set_state":true}设置成功 {"command":"close_modbus_mode","set_state":false}设置失败 |
(3)配置连接 ModbusTCP 从站(I 系列)
功能描述 | 控制器作为 ModbusTCP 主站连接外部ModbusTCP 从站设备 |
---|---|
参数说明 | set_modbustcp_mode:连接ModbusTCP 从站 |
命令格式 | {s:s,s:s,s:i,s:i} |
示例 | {"command":"set_modbustcp_mode","ip":"192.168.1.120","port ":502,"timeout":2000} |
说明 | ip: 从机IP 地址,port: 端口号,timeout: 超时时间,单位:秒 |
返回值 | {"command":"set_modbustcp_mode","set_state":true} //连接成功 {"command":"set_modbustcp_mode","set_state":false} //连接失败 |
(4)配置关闭 ModbusTCP 从站(I 系列)
功能描述 | 断开控制器连接的ModbusTCP 从站设备 |
---|---|
参数说明 | close_modbustcp_mode:断开ModbusTCP 从站 |
命令格式 | {s:s} |
示例 | {"command":"close_modbustcp_mode"} |
返回值 |
{"command":"close_modbustcp_mode","set_state":true} //成功 |
(5)读线圈
功能描述 | 读线圈 |
---|---|
参数说明 | read_coils:读线圈 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"read_coils","port":0,"address":10,"num":2,"device": 2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:线圈起始地址 num:要读的线圈的数量,该指令最多一次性支持读 8 个线圈数据,即返回的数据不会超过一个字节 device:外设设备地址 |
返回值 | {"command":"read_coils","data":8}读取成功,返回线圈状态,数据类型:int8 {"command":"read_coils","read_state":false}读取失败,超时时间内未获取到数据 |
(6)读离散量输入
功能描述 | 读离散量输入 |
---|---|
参数说明 | read_input_status:读离散量输入 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"read_input_status","port":0,"address":10,"num":2," device":2} |
说明 | port:通讯端口,0-控制器RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:数据起始地址 num:要读的数据的数量,该指令最多一次性支持读 8 个离散量数据,即返回的数据不会超过一个字节 device:外设设备地址 |
返回值 |
{"command":"read_input_status","data":8}读取成功,返回离散量, 数据类型:int8 |
(7)读保持寄存器
功能描述 | 读保持寄存器 |
---|---|
参数说明 | read_holding_registers:读保存寄存器 |
命令格式 | {s:s,s:i,s:i,s:i} |
示例 | {"command":"read_holding_registers","port":0,"address":10,"devi ce":2} |
说明 | port:通讯端口,0-控制器RS485 端口,1-末端接口板RS485 接口,3-控制器 ModbusTCP 设备 address:数据起始地址,该指令每次只能读 1 个寄存器,即 2 个字节的数据,不可一次性读取多个寄存器数据 device:外设设备地址 |
返回值 | {"command":"read_holding_registers","data":8}读取成功,返回寄 存器数据,数据类型:int16 {"command":"read_holding_registers","read_state":false}读取失败,超时时间内未获取到数据 |
(8)读输入寄存器
功能描述 | 读输入寄存器 |
---|---|
参数说明 | read_input_registers:读输入寄存器 |
命令格式 | {s:s,s:i,s:i,s:i} |
示例 | {"command":"read_input_registers","port":0,"address":10,"device ":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:数据起始地址,该指令每次只能读 1 个寄存器,即 2 个字节的数据,不可一次性读取多个寄存器数据 device:外设设备地址 |
返回值 | {"command":"read_input_registers","data":8}读取成功,返回寄存器数据,数据类型:int16 {"command":"read_input_registers","read_state":false}读取失败, 超时时间内未获取到数据 |
(9)写单圈数据
功能描述 | 写单圈数据 |
---|---|
参数说明 | write_single_coil:写单圈数据 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"write_single_coil","port":0,"address":10,"data":1,"d evice":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:线圈起始地址 data:要写入线圈的数据,数据类型:int16 device:外设设备地址 |
返回值 | {"command":"write_single_coil","write_state":true}写操作成功 {"command":"write_single_coil","write_state":false}写操作失败, 超时时间内未获取到数据,或者指令内容错误 |
(10)写单个寄存器
功能描述 | 写单个寄存器数据 |
---|---|
参数说明 | write_single_register:写单个寄存器 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"write_single_register","port":0,"address":10,"data": 1000,"device":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:寄存器起始地址 data:要写入寄存器的数据,数据类型:int16 device:外设设备地址 |
返回值 | {"command":"write_single_register","write_state":true}写操作成功 {"command":"write_single_register","write_state":false}写操作失 败,超时时间内未获取到数据,或者指令内容错误 |
(11)写多个寄存器
功能描述 | 写多个寄存器数据 |
---|---|
参数说明 | write_registers:写多个寄存器 |
命令格式 | {s:s,s:i,s:i,s:i,s:[i,i…],s:i } |
示例 | {"command":"write_registers","port":0,"address":10,"num":2,"dat a":[15, 20, 25, 30],"device":2} |
说明 |
port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 device:外设设备地址 |
返回值 | {"command":"write_registers","write_state":true}写操作成功 {"command":"write_registers","write_state":false}写操作失败,超 时时间内未获取到数据,或者指令内容错误 |
(12)写多圈数据
功能描述 | 写多圈数据 |
---|---|
参数说明 | write_coils:写多个寄存器 |
命令格式 | {s:s,s:i,s:i,s:i,s:[i,i…] ,s:i } |
示例 | {"command":"write_coils","port":0,"address":10,"num":16,"data": [15, 20],"device":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板RS485 接口,3-控制器ModbusTCP 设备 address:线圈起始地址 num:写线圈个数,每次写的数量不超过 160 个 data:要写入线圈的数据数组,类型:byte。若线圈个数不大于 8, 则写入的数据为 1 个字节;否则,则为多个数据的数组 device:外设设备地址 |
返回值 | {"command":"write_coils","write_state":true}写操作成功 {"command":"write_coils","write_state":false}写操作失败,超时时间内未获取到数据,或者指令内容错误 |
(13)读多圈数据
功能描述 | 读多圈数据 |
---|---|
参数说明 | read_multiple_coils:读线圈 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"read_multiple_coils","port":0,"address":0,"num":24, "device":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板 RS485 接口,3-控制器ModbusTCP 设备 address:线圈起始地址 num: 8< num <= 120 要读的线圈的数量,该指令最多一次性支持读 120 个线圈数据, 即 15 个byte device:外设设备地址 |
返回值 |
{"command":"read_multiple_coils","data":[1,2,3]}读取成功,返回 线圈状态,数据类型: |
(14)读多个保存寄存器
功能描述 | 读多个保持寄存器 |
---|---|
参数说明 | read_multiple_holding_registers:读多个保持寄存器 |
命令格式 | {s:s,s:i,s:i,s:i,s:i} |
示例 | {"command":"read_multiple_holding_registers","port":0,"address ":0,"num":5,"device":2} |
说明 | port:通讯端口,0-控制器 RS485 端口,1-末端接口板 RS485 接口,3-控制器ModbusTCP 设备 address:寄存器起始地址 num:2 < num < 13 要读的寄存器的数量,该指令最多一次性支持读 12 个寄存器数据, 即 24 个byte device:外设设备地址 |
返回值 | {"command":"read_multiple_holding_registers","data":[1,2,3,4,5, 6,7,8,9,10]}读取成功,返回寄存器数据,数据类型:int8 {"command":"read_multiple_holding_registers","read_state":fals e}读取失败,超时时间内未获取到数据 |
3.典型末端执行器的控制说明
这里电动吸盘为例,参考如下的文档《JODELL钧舵EVS01系列电动吸盘通用详细说明书V1.1.pdf》第七章。
第一步:激活请求
清除并设置 rACT=0,请求:09 10 03 E8 00 01 02 00 00 E5 B8
注:这里的Ract 代表吸盘的使能状态其中0代表下使能,1代表上使能状态其指令与描述如下图所示:
说明:其中首先看我们的功能代码是16,代表的是读写多个寄存器,对应的我们的json协议如下:
从站号对应的是外部设备地址,端口是末端的接口板的rs485接口,地址是对应的第写入的寄存器地址,寄存器数量对应的就是写寄存器的数量,写入寄存器的内容就是对应上面的数组的对应位数。值得注意的是对应的16进制要转化为json可接收的10进制的数据,具体数据对应会有标注。
回复:09 10 03 E8 00 01 80 F1
当转换完成后,得到了一个关于如何让电动吸盘上使能的json字符串。如下,同理。
设置 rACT=1,请求:09 10 03 E8 00 01 02 00 01 24 78
回复:09 10 03 E8 00 01 80 F1
第二步:设置参数
那么,第二步我们就要设置参数了
请求:09 10 03 E9 00 02 04 28 00 50 28 36 A3
回复:09 10 03 E9 00 02 91 30
第三步:启动吸盘
请求:09 10 03 E8 00 01 02 00 01 02 00 0F A5 BC
回复:09 10 03 E8 00 01 80 F1
第四步:以破真空方式停止吸盘
请求:09 10 03 E8 00 01 02 00 37 A4 6E
回复:09 10 03 E8 00 01 80 F1
三、调试助手控制末端执行器(json协议)
1.JSON协议MODBUS-RTU接口介绍
Json协议是世界上共用协议标准也称为json字符串,控制器解析json字符串底层原理如同网络编程一样来进行数据的传输,这得益于我们的网络传输ethnet的接口,复合我们的Tcp/IP协议的数据传输格式,我们的控制器解析json协议的底层执行原理是调用我们的接口函数来进行机械臂的控制。
Mobdus接口是根据modbus-rtu协议来进行数据传输,他的传输数据呢是十六进制的数据,然当封装接口函数为了直观的显示给用户,例如一个夹爪的开口大小是0-1000,这样呢就涉及到10进制与二进制的转换,当然,这个是机器自动完成的,然而用户如果使用呢,就必须了解其映射的转换原理,以及想要的数据如何结合我们的机械臂的json协议来进行转换。
2.串口指令的解析
电动吸盘 Modbus 寄存器大体分为两种,一种是控制寄存器,一种是状态寄存器,顾名思义,控制寄存器用来控制吸盘,状态寄存器呢则是用来查询吸盘的状态。详情参考《JODELL钧舵EVS01系列电动吸盘通用详细说明书V1.1.pdf》第 6 章 Modbus 协议说明,其表内容如下:
这里的控制寄存器一般是写入数据,控制状态返回寄存器呢是可以获取到末端工具的控制状态的寄存器。
如下介绍了状态寄存器的数据读取方法,与如上写入的数据相同,读取也是按照位来进行读取解析状态的,具体位参考如下表。
可以看到的是,它并不像控制寄存器这样只在高字节或者低字节位进行保留,而是穿插预留位数,具体根据文档中的数据自行读取。
3.调试助手协议控制末端执行器
睿尔曼系列机械臂有着丰富的外设接口,可十分便捷的与其他执行器相结合。如:二指夹爪、五指灵巧手、真空吸盘等。本文主要介绍真空吸盘与机械臂集成的使用,后续会陆续将其他设置的使用发出来。
真空吸盘结构安装
第一步,整理配件。
第二步,转接件与真空吸盘连接使用M*15螺丝连接
第三步,在第二步的基础上使用M6*15mm螺丝将转接件与吸盘相连并进行电路连接。如下图所示(注意:此处使用6芯线连接机械臂与真空吸盘时,机械臂需断电)
真空吸盘控制
真空吸盘的控制可以用JSON协议控制、高级语言SDK开发方式实现,本文将依次介绍这2种方式如何实现。实现真空吸盘控制的前提为真空吸盘已安装在机械臂末端,并且通过连接线连接。
真空吸盘与机械臂之间使用RS485信道,通过MODBUS RTU协议实现通信,完成对真空吸盘的控制。
JSON协议控制
JSON协议中有机型的协议示例,可根据实际的使用场景进行选择,本文中仅举例说明使用。
①使用网线将机械臂与上位机连接,并将上位机IPV4地址修改为192.168.1.100(此操作可在-通信及连接方式内容中找到)。
②在网盘资源中下载并打开“TCP&UDP测试工具”,创建TCP连接,输入机械臂的IP及端口号。
③创建完毕之后,点击连接按钮。此时可连接至机械臂。
④打开资料“RM-65\(3)协议文档”下的《睿尔曼6自由度机械臂JSON通信协议v3.5.1.pdf》文档。
⑤打开文档之后,找到4.7 末端工具IO控制、4.8 末端工具-真空吸盘控制(选配)部分内容。
第一步,在末端工具IO控制中设置工具端电源输出,根据文档中协议说明及参数说明复制协议内容至TCP测试工具中。
协议内容:
末端输出24V电源:{"command":"set_tool_voltage","voltage_type":3}
第二步,根据文档4.8中的说明依次发送以下协议内容:
协议内容:
真空吸盘启动,双通道启动:{"command":"write_single_register","port":1,"address":1000,"data":29,"device":9}
{"command":"write_single_register","port":1,"address":1000,"data":109,"device"9}
真空吸盘松开:
{"command":"write_single_register","port":1,"address":1000,"data":37,"device":9}
此处以真空吸盘松开举例其请求指令如下:
请求:09 10 03 E8 00 01 02 00 25 24 63
09 从站地 -> device:9
10 功能代码 16(读写多个寄存器)+ 0001 写入的寄存器数量 -> write_single_register
03E8 读取第一个请求的寄存器的地址 -> address:1000
0025 写入寄存器 03E8 的内容 -> data:37
2463 CRC 校验自动生成
02 数据字节数这里是02上面选用的是写单个寄存器所以不用考虑数据字节长度问题
此协议内容如下《吸盘json.txt》
四、python控制末端执行器(API)
1.API MODBUS-RTU接口介绍
睿尔曼机械臂在控制器的航插和末端接口板航插处,各有 1 路 RS485 通讯 接口,这个 RS485 端口可通过接口配置为标准的 ModbusRTU 模式。然后通 过接口对端口连接的外设进行读写操作。 注意:控制器的 RS485 接口在未配置为 Modbus RTU 模式的情况下,可用 于用户对机械臂进行控制,这两种模式不可兼容。若要恢复机械臂控制模式,必须将该端口的 Modbus RTU 模式关闭。Modbus RTU 模式关闭后,系统会自动 切换回机械臂控制模式,波特率 460800BPS,停止位 1,数据位 8,无检验。 同时,I 系列控制器支持 modbus-TCP 主站配置,可配置使用 modbus-TCP 主站,用于连接外部设备的 modbus-TCP 从站。详细的接口参数列表请参考如下文档《睿尔曼机械臂接口函数说明(Python)V1.3》第5章节。
2. python程序调用modbus-RTU接口控制末端执行器
from robotic_arm import *
import socket
import time
ip = "192.168.1.18"
port = 8080
robot = Arm(RM65,ip,port)
#控制器寄存器地址
Control_Register_Address = int('03E8',16)
#通讯端口
c_port = 1
serve_address = (ip,port)
#设备地址
device_address = 9
def Socket_Connect():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client.connect(serve_address)
print("机械臂Socket连接成功")
return True
except socket.error as e:
print("机械臂Socket连接失败")
return False
if __name__ =="__main__":
Socket_Connect()
#设置工具端电压
robot.Set_Tool_Voltage(3)
print("设置工具端电源输出24V成功")
time.sleep(1)
#配置末端为Modbus RTU模式
robot.Set_Modbus_Mode(1,115200,2)
print("配置末端Modbus RTU成功")
#请求激活,使能电动吸盘
robot.Write_Single_Register(c_port,Control_Register_Address,0,device_address) #清除并设置rACT = 0
time.sleep(0.5)
robot.Write_Single_Register(c_port, Control_Register_Address, 1, device_address) #设置rACT = 1
print("使能吸盘成功")
#启动吸盘
robot.Write_Single_Register(c_port, Control_Register_Address, int('001D',16), device_address) # 启动吸盘
print("启动吸盘成功")
time.sleep(1)
robot.Write_Single_Register(c_port, Control_Register_Address, 109, device_address)
time.sleep(10)
#以破真空方式停止吸盘
robot.Write_Single_Register(c_port, Control_Register_Address, int('0025',16), device_address)
#关闭末端Modbus RTU模式
robot.Close_Modbus_Mode(1,False)
print("末端Modbus RTU关闭成功")
print("机械臂Socket关闭成功")
通过modbus调用接口程序如附件API_Example_Python.zip中API_Example_Python.py
五、常见末端工具问题排查
常见的问题具体排查参考如下脑图:
撰写评论