CS機(jī)器人RS485通訊
1. 控制柜485
艾利特機(jī)器人CS系列支持RS485通訊,用戶(hù)可以通過(guò)將 RS485 設(shè)備連接到圖 1-1 中所示的連接器來(lái)從控制柜執(zhí)行串行通信。為了能在控制柜中設(shè)置 RS485 連接器,必須拆掉串口連接 器,并將 RS485 線焊接到黑色連接器背面的金屬觸點(diǎn),如圖 1-2 所示。黑色塑料裝置的正反 面分別標(biāo)有 PIN“1 3 5”和“2 4 6”。PIN3 應(yīng)焊接到 RS485B,PIN4 應(yīng)焊接 到 RS485A。該 接口支持的最大波特率為 500Kbps。


2. 工具IO485
艾利特機(jī)器人同樣支持末端工具485通訊,當(dāng)需要使用末端 RS485 接口與執(zhí)行器通信時(shí), 需要在示教器工具 IO 界面下進(jìn)行配置,具體配置路 徑為:“工具模擬 IO>工具模式”,選擇 USART 模式,并根據(jù)執(zhí)行器實(shí)際參數(shù)配置波特率等參數(shù)。從在機(jī)器人控制器上寫(xiě)入發(fā)送數(shù)據(jù)到 數(shù)據(jù)在 RS485 上開(kāi)始發(fā)送,延遲范圍為 2ms 到 4ms。從在 RS485 上開(kāi)始接收數(shù)據(jù)到機(jī)器人控制器收到數(shù)據(jù)并開(kāi)始處理,延遲范圍為 2ms 到 4ms。本篇文章介紹控制柜實(shí)現(xiàn)485通訊方式,工具端485查詢(xún)腳本手冊(cè)。
3. 腳本指令
3.1 控制柜RS-485 配置
serial_config(enable, baud, parity_bit, stop_bit, size, modbus_rtu, port="/dev/ttymxc0")
功能: 該指令用于打開(kāi)或關(guān)閉機(jī)器人控制柜 RS-485 通信功能,并對(duì)其進(jìn)行配置。
參數(shù): enable:串口通信的使能狀態(tài),boolean 型數(shù)據(jù);
baud:波特率,integer 型數(shù)據(jù):2400、4800、9600、19200、38400、57600、115200、230400、 460800、921600、500000;
parity_bit:串口奇偶校驗(yàn),integer 型數(shù)據(jù):0(不校驗(yàn))、1(奇校驗(yàn))、2(偶校校驗(yàn));
stop_bit:串口停止位,integer 型數(shù)據(jù):1、2;
size:串口的位寬。不指定時(shí),使 用默認(rèn)參數(shù) 8,integer 型數(shù)據(jù):7 或 8(可選參數(shù))。 若為 MODBUSRTU 模式,則必須為 8;
modbus_rtu:是否啟用 modbus-rtu 模式,指定為 True 時(shí)為 Modbus-rtu 模式,指定為 False 時(shí)為 RS485 模式,不指定時(shí)使用默認(rèn)參數(shù) False,boolean 類(lèi)型數(shù)據(jù);
port : 串口的端口名,目前僅支持 :”/dev/ttymxc0” 。不指定名稱(chēng)時(shí) , 使用默認(rèn)名稱(chēng) “/dev/ttymxc0”,string 型數(shù)據(jù)(可選參數(shù))。
返回值: 如果配置成功,返回 True,如果配置失敗,返回 False,boolean 型數(shù)據(jù) 。
3.2 寫(xiě)入控制柜 RS-485 通信數(shù)據(jù)
serial_write(data, port="/dev/ttymxc0")
功能: 該指令用于機(jī)器人控制柜 RS-485 發(fā)送數(shù)據(jù)。
參數(shù): data:待發(fā)送的數(shù)據(jù),string 型數(shù)據(jù)、integer 型數(shù)據(jù)、整數(shù) list 型數(shù)據(jù)、bytes 型數(shù)據(jù)或 bytearray 型數(shù)據(jù),若為 integer 或整數(shù) list 型數(shù)據(jù),會(huì)寫(xiě)入一個(gè)或多個(gè)整數(shù)數(shù)據(jù),數(shù)據(jù)值若超過(guò) [0-255] 范圍, 會(huì)自動(dòng)按照內(nèi)存類(lèi)型轉(zhuǎn)換或內(nèi)存截?cái)?/span>的方式強(qiáng)制轉(zhuǎn)換至范圍內(nèi)。
port:串口的端口名,目前僅支持:”/dev/ttymxc0”。不指定名稱(chēng)時(shí),使用默認(rèn)名稱(chēng)“/dev/ttymxc0”, string(可選參數(shù))。
返回值: 如果發(fā)送成功,返回 True,如果發(fā)送失敗,返回 False,boolean 型數(shù)據(jù)。
3.3 讀取控制柜 RS-485 通信數(shù)據(jù)
serial_read(len,is_number=True,time_out=0.1,port="/dev/ttymxc0")
功能: 該指令用于讀取機(jī)器人控制柜 RS-485 通信的數(shù)據(jù)。
參數(shù): len:要讀取的字節(jié)數(shù),注意假設(shè)要讀取的字節(jié)數(shù)為 5,但實(shí)際只接收到 2 字節(jié)數(shù)據(jù),最后讀出的 長(zhǎng)度為 2 字節(jié);
is_number:是否按照整數(shù)格式返回字節(jié)數(shù)據(jù)。若不指定,使用默認(rèn)參數(shù) True,boolean 型數(shù)據(jù) (可選參數(shù));
time_out:超時(shí)時(shí)間,單位:秒,若小于等于 0,則等待超時(shí)時(shí)間為無(wú)限長(zhǎng),不指定時(shí),使用默 認(rèn)值 0.1,float 型數(shù)據(jù)(可選參數(shù));
port : 串 口 的 端 口 名 ,目前僅支持 :”/dev/ttymxc0” 。 不 指 定 名 稱(chēng) 時(shí) ,使用默認(rèn)名 稱(chēng) “/dev/ttymxc0”,string 型數(shù)據(jù)(可選參數(shù))。
返回值: bytearray 或 list 型數(shù)據(jù),若 is_number 參數(shù) True,則返回值為整數(shù)類(lèi)型的 list,若is_number 參數(shù) False,則返回值為 bytes array,若發(fā)生超時(shí),則返回所有已經(jīng)讀取到的數(shù)據(jù)。
如果僅需要與外部設(shè)備485通訊用上述3條腳本指令即可收發(fā),如想同時(shí)寫(xiě)入\讀取多個(gè)寄存 器查找腳本手冊(cè)“寫(xiě)入\讀取多個(gè)MODBUS寄存器指令”,本文檔舉例和升降柱做485通訊。

下文為機(jī)器人腳本示例:
import struct
global Currentposition
#通訊設(shè)置modbus_rtu
def Connection_rtu():#連接機(jī)器人與升降柱伺服通訊
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():#復(fù)位伺服故障,絕大多數(shù)故障可復(fù)位
serial_write([1,3329,1])
return "Fault reset Success"
return
def Point_speed(speed):#設(shè)置點(diǎn)動(dòng)的速度最小0,最大3000,單位rpm
serial_write(1, 1540, speed)
return
def Move_position_speed(position,speed):#設(shè)置多段移動(dòng)的位置和速度,位置1MM等于10000個(gè)脈沖
#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():#到達(dá)上限位置,DI2觸發(fā),停止上升,升降柱處于伺服使能狀態(tài)
sleep(0.01)
in2 = get_standard_digital_in(2)
if in3 == True:
Servo_control(1)
def Lower_limit_stop():#到達(dá)下限位置,DI3觸發(fā),停止下降,升降柱處于伺服使能狀態(tài)
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 與通訊助手測(cè)試案例

舉例機(jī)器人發(fā)送端,發(fā)送整數(shù)123,助手端同樣收到123。
注:1.下圖中紅色方框內(nèi)的顯示編碼格式需設(shè)置為十進(jìn)制,因?yàn)闄C(jī)器人發(fā)送十進(jìn)制,若不勾選,則會(huì)顯示16進(jìn)制的123,值為7B。

十進(jìn)制"123"

十六進(jìn)制“123“

超過(guò)255的數(shù)據(jù),顯示選擇Ascll
舉例機(jī)器人接收端:

助手發(fā)送需勾選16進(jìn)制發(fā)送

機(jī)器人接收后會(huì)轉(zhuǎn)為10進(jìn)制
這種方法看起來(lái)不夠直觀,因此建議接收時(shí)不選用list,選擇bytearray,注意在接收指令的后面加python解碼指令,編譯為utf-8。

不需要勾選16進(jìn)制

這里選擇解碼編譯utf-8,可直接讀到助手發(fā)送的值