CS机器人RS485通讯
1. 控制柜485
艾利特机器人CS系列支持RS485通讯,用户可以通过将 RS485 设备连接到图 1-1 中所示的连接器来从控制柜执行串行通信。为了能在控制柜中设置 RS485 连接器,必须拆掉串口连接 器,并将 RS485 线焊接到黑色连接器背面的金属触点,如图 1-2 所示。黑色塑料装置的正反 面分别标有 PIN“1 3 5”和“2 4 6”。PIN3 应焊接到 RS485B,PIN4 应焊接 到 RS485A。该 接口支持的最大波特率为 500Kbps。
图 1-1CS 控制柜 RS485 连接器
图1- 2 黑色器件
2. 工具IO485
艾利特机器人同样支持末端工具485通讯,当需要使用末端 RS485 接口与执行器通信时, 需要在示教器工具 IO 界面下进行配置,具体配置路 径为:“工具模拟 IO>工具模式”,选择 USART 模式,并根据执行器实际参数配置波特率等参数。 从在机器人控制器上写入发送数据到 数据在 RS485 上开始发送,延迟范围为 2ms 到 4ms。从在 RS485 上开始接收数据到机器人控 制器收到数据并开始处理,延迟范围为 2ms 到 4ms。 本篇文章介绍控制柜实现485通讯方式,工具端485查询脚本手册。
3. 脚本指令
3.1 控制柜RS-485 配置
serial_config(enable, baud, parity_bit, stop_bit, size, modbus_rtu, port="/dev/ttymxc0")
功能: 该指令用于打开或关闭机器人控制柜 RS-485 通信功能,并对其进行配置。
参数: enable:串口通信的使能状态,boolean 型数据;
baud:波特率,integer 型数据:2400、4800、9600、19200、38400、57600、115200、230400、 460800、921600、500000;
parity_bit:串口奇偶校验,integer 型数据:0(不校验)、1(奇校验)、2(偶校校验);
stop_bit:串口停止位,integer 型数据:1、2;
size:串口的位宽。不指定时,使 用默认参数 8,integer 型数据:7 或 8(可选参数)。 若为 MODBUSRTU 模式,则必须为 8;
modbus_rtu:是否启用 modbus-rtu 模式,指定为 True 时为 Modbus-rtu 模式,指定为 False 时为 RS485 模式,不指定时使用默认参数 False,boolean 类型数据;
port : 串口的端口名,目前仅支持 :”/dev/ttymxc0” 。不指定名称时 , 使用默认名称 “/dev/ttymxc0”,string 型数据(可选参数)。
返回值: 如果配置成功,返回 True,如果配置失败,返回 False,boolean 型数据 。
3.2 写入控制柜 RS-485 通信数据
serial_write(data, port="/dev/ttymxc0")
功能: 该指令用于机器人控制柜 RS-485 发送数据。
参数: data:待发送的数据,string 型数据、integer 型数据、整数 list 型数据、bytes 型数据或 bytearray 型数据,若为 integer 或整数 list 型数据,会写入一个或多个整数数据,数据值若超过 [0-255] 范围, 会自动按照 内存类型转换或内存截断的方式强制转换至范围内。
port:串口的端口名,目前仅支持:”/dev/ttymxc0”。不指定名称时,使用默认名称“/dev/ttymxc0”, string(可选参数)。
返回值: 如果发送成功,返回 True,如果发送失败,返回 False,boolean 型数据。
3.3 读取控制柜 RS-485 通信数据
serial_read(len,is_number=True,time_out=0.1,port="/dev/ttymxc0")
功能: 该指令用于读取机器人控制柜 RS-485 通信的数据。
参数: len:要读取的字节数,注意假设要读取的字节数为 5,但实际只接收到 2 字节数据,最后读出的 长度为 2 字节;
is_number:是否按照整数格式返回字节数据。若不指定,使用默认参数 True,boolean 型数据 (可选参数);
time_out:超时时间,单位:秒,若小于等于 0,则等待超时时间为无限长,不指定时,使用默 认值 0.1,float 型数据(可选参数);
port : 串 口 的 端 口 名 ,目前仅支持 :”/dev/ttymxc0” 。 不 指 定 名 称 时 ,使用默认名 称 “/dev/ttymxc0”,string 型数据(可选参数)。
返回值: bytearray 或 list 型数据,若 is_number 参数 True,则返回值为整数类型的 list,若is_number 参数 False,则返回值为 bytes array,若发生超时,则返回所有已经读取到的数据。
如果仅需要与外部设备485通讯用上述3条脚本指令即可收发,如想同时写入\读取多个寄存 器查找脚本手册“写入\读取多个MODBUS寄存器指令”,本文档举例和升降柱做485通讯。
下文为机器人脚本示例:
import struct
global Currentposition
#通讯设置modbus_rtu
def Connection_rtu():#连接机器人与升降柱伺服通讯
while True:
Open_RS485 = serial_config(True,57600,0,2,8,True)
mode = serial_mode()
if mode == "MODBUS-RTU":
return "Connection Success"
break
def Fault_reset():#复位伺服故障,绝大多数故障可复位
serial_write([1,3329,1])
return "Fault reset Success"
return
def Point_speed(speed):#设置点动的速度最小0,最大3000,单位rpm
serial_write(1, 1540, speed)
return
def Move_position_speed(position,speed):#设置多段移动的位置和速度,位置1MM等于10000个脉冲
#position = position * 10000
getpos = struct.pack("i",position)
posset = struct.unpack("2H",getpos)
serial_modbus_write_registers(1,4364,[posset[0],posset[1]])
sleep(0.01)
serial_modbus_write_single_register(1,4366,speed)
return
while True:
in3 = get_standard_digital_in(3)
if in3 == True :
Servo_control(17)
sleep(0.1)
Servo_control(49)
sleep(0.5)
Servo_control(17)
sleep(0.1)
Servo_control(49)
break
sync()
def Upper_limit_stop():#到达上限位置,DI2触发,停止上升,升降柱处于伺服使能状态
sleep(0.01)
in2 = get_standard_digital_in(2)
if in3 == True:
Servo_control(1)
def Lower_limit_stop():#到达下限位置,DI3触发,停止下降,升降柱处于伺服使能状态
sleep(0.01)
in3 = get_standard_digital_in(3)
if in3 == True:
Servo_control(1)
Connection_rtu()
#Fault_reset()
#sleep(0.01)
#Originsetting()
#Currentposition = Current_position()
#sleep(0.01)
#Servo_control(1)
#sleep(0.01)
#Move_position_speed(100000,500)
#sleep(0.01)
#Servo_control(9)
while True:
Upper_limit_stop()
Lower_limit_stop()
Currentposition = Current_position()
3.4 与通讯助手测试案例
举例机器人发送端,发送整数123,助手端同样收到123。
注:1.下图中红色方框内的显示编码格式需设置为十进制,因为机器人发送十进制,若不勾选,则会显示16进制的123,值为7B。
十进制"123"
十六进制“123“
超过255的数据,显示选择Ascll
举例机器人接收端:
助手发送需勾选16进制发送
机器人接收后会转为10进制
这种方法看起来不够直观,因此建议接收时不选用list,选择bytearray,注意在接收指令的后面加python解码指令,编译为utf-8。
不需要勾选16进制
这里选择解码编译utf-8,可直接读到助手发送的值