CS機器人 30001端口使用
1. 簡介
30001端口,可用于獲取機器人的各種狀態及數據,機器人會以10HZ(100ms)的頻率向30001端口發送機器人的狀態數據,還可以往30001端口發送腳本命令,運動指令,控制機器人運動等。(FB1網口)
2. 發送腳本控制機器人
外部設備可以往30001直接發送機器人腳本,機器人處于遠程模式,機器人就會運動。
(點擊下圖右上角的Elite logo,可以進入設置界面)

遠程控制選擇啟用

將機器人切換為遠程控制模式

用戶可以在socket調試助手中,發送以下代碼進行測試
外部發送的腳本格式如下:即def開頭,end結尾(end后加入換行)。中間內容為機器人支持的腳本。
def a():
movej([-3.14,-1.57,-1.57,-1.57,1.57,0],a=1.4,v=0.5,t=0,r=0)
movej([-1.57,-1.57,-1.57,-1.57,1.57,0],a=1.4,v=0.5,t=0,r=0)
end
也可使用如下代碼,發送帶有函數調用的腳本
def test(): # 最外層def必須增加end\n結尾
# 內部是正常的python語法
def mov():
movej([0.57636,-1.01469,-2.04816,-1.29723,1.5708,-0],a=1.4,v=1.05,t=0,r=0)
a = "hello cs"
if a == "hello cs":
mov()
end

3. 數據接收及解析
接收機器人狀態數據
該端口還會以10Hz的頻率持續不斷地將機器人的狀態數據以固定格式往外發送。數據格式大體如下:
機器人狀態報文格式
4 字節
報文長度
1 字節
報文類型 = MESSAGE_TYPE_ROBOT_STATE = 16
4 字節
子報文長度
1 字節
子報文類型
n 字節
子報文內容
4 字節
子報文長度
1 字節
子報文類型
n字節
子報文內容
4 字節
報文長度
1 字節
報文類型 = MESSAGE_TYPE_ROBOT_STATE = 16
4 字節
子報文長度
1 字節
子報文類型
n 字節
子報文內容
4 字節
子報文長度
1 字節
子報文類型
n字節
子報文內容
詳細每一段子報文的內容請參考《CS_用戶手冊_機器人狀態報文.xlsx》
機器人狀態數據報文主題結構包含報文頭、機器人模式數據子報文、關節數據子報文、笛卡爾數據子報文、機器人配置數據子報文、機器人主板信息子報文、機器人附加信息子報文、內部使用子報文、機器人工具數據子報文、機器人安全狀態子報文、機器人工具通訊子報文、內部使用子報文等內容.
每一段子報文內的數據長度、格式都是嚴格定義的,用戶讀取時按需擇取對應數據段按照指定格式進行數據解析。
以下使用Python對機器人配置數據子報文解析為例說明。
程序流程如下:

4. 示例
參考代碼:
from robot import *
import argparse
import logging
import time
import numpy as np
from math import *
parser = argparse.ArgumentParser()
#以下IP地址需要修改
parser.add_argument('--host', default='192.168.1.200', help='name of host to connect to (localhost)')
parser.add_argument('--port', type=int, default=30001, help='port number (30001)')
parser.add_argument('--samples', type=int, default=100, help='number of samples to record')
args = parser.parse_args()
robot = Robot('RobotStateMessage.xlsx', 'v2.1.0')
robot.connect(args.host, args.port)
sample_count = args.samples
while sample_count > 0:
data = robot.get_data()
if data == None:
logging.warning("Data is None")
continue
print(" {:=^50s}".format(""))
print("基坐標X、Y、Z")
print("tcp_x: "+('{:.2f}'.format(data.tcp_x*1000)))
print("tcp_y: "+('{:.2f}'.format(data.tcp_y*1000)))
print("tcp_z: "+('{:.2f}'.format(data.tcp_z*1000)))
#print("actual_joint : ")
print("RX、RY、RZ\x20關節單位\x20°")
print("RX: " + ('{:.3f}'.format(degrees(data.rot_x))))
print("RY: " + ('{:.3f}'.format(degrees(data.rot_y))))
print("RZ: " + ('{:.3f}'.format(degrees(data.rot_z))))
print(" {:=^50s}".format(""))
print("關節位置\x20關節單位\x20°")
print("一軸、基座\x20"'{:.2f}'.format(degrees(data.actual_joint0)))
print("二軸、肩部\x20"'{:.2f}'.format(degrees(data.actual_joint1)))
print("三軸、肘部\x20"'{:.2f}'.format(degrees(data.actual_joint2)))
print("四軸、手腕1\x20"'{:.2f}'.format(degrees(data.actual_joint3)))
print("五軸、手腕2\x20"'{:.2f}'.format(degrees(data.actual_joint4)))
print("六軸、手腕3\x20"'{:.2f}'.format(degrees(data.actual_joint5)))
print(" {:=^50s}".format(""))
#機器人是否上電:上電為true,未上電為false
print("機器人是否上電",data.is_robot_power_on)
#print(data.is_robot_power_on)
print("是否處于機器人急停和系統急停",data.is_robot_protective_stopped)
#print(data.is_robot_protective_stopped)
print("是否處于保護停止",data.is_robot_protective_stopped)
#print(data.is_robot_protective_stopped)
print("程序是否處于運行態",data.is_program_running)
#print(data.is_program_running)
print("程序是否暫停",data.is_program_paused)
#print(data.is_program_paused)
print("機器人模式",data.get_robot_mode)
#print(data.get_robot_mode)
print("機器人控制模式",data.get_robot_control_mode)
print("0未確認、1確認安全、2初始化、3下點、4上電、5空閑、6反向驅動、7正在運行、8升級固件、9等待編碼器標定")
#print(data.get_robot_control_mode)
print("機器人速度模式",data.get_robot_speed_mode)
#print(data.get_robot_speed_mode)
print("機器人是否處于系統報警狀態",data.is_robot_system_in_alarm)
#print(data.is_robot_system_in_alarm)
print("主板是否在縮減模式",data.is_robot_in_reduced_mode)
print("碰撞檢測模式狀態",data.is_dynamic_collision_detect_enabled)
print("工具模擬IO輸出配置",data.tool_analog_output_domain)
#print("")
#print(data.)
print(" {:=^50s}".format(""))
#print(data.actual_velocity1)弧度/秒
print("關節實際速度\x20角度/秒")
print("1軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity0)))
print("2軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity1)))
print("3軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity2)))
print("4軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity3)))
print("5軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity4)))
print("6軸實際速度\x20"'{:.2f}'.format(degrees(data.actual_velocity5)))
print(" {:=^50s}".format(""))
print("關節力矩")
print("1關節力矩\x20"'{:.2f}'.format(data.torques0))
print("2關節力矩\x20"'{:.2f}'.format(data.torques1))
print("3關節力矩\x20"'{:.2f}'.format(data.torques2))
print("4關節力矩\x20"'{:.2f}'.format(data.torques3))
print("5關節力矩\x20"'{:.2f}'.format(data.torques4))
print("6關節力矩\x20"'{:.2f}'.format(data.torques5))
print(" {:=^50s}".format(""))
print("模擬IO0輸出值.\x2002-0.004單位A")
print(data.standard_analog_output_value0,"A")
print(data.standard_analog_output_value1,"A")
print("工具模擬IO輸出配置",data.tool_analog_output_domain)
print("工具輸出電壓數值",data.tool_output_voltage,"V")
print("工具輸出電流", data.tool_current,"A")
#print(" {:=^50s}".format(""))
sample_count -= 1
time.sleep(2)
5. 常見問題解答
5.1.問:端口連接不上,連接沒反應
答:檢修一下網絡是不是沒有連接上,可以在示教器網絡設置頁面查看,或者使用電腦ping一下看看能否ping通,網口是否正常連接的FB1口
5.2.問:向端口發送運動指令機器人不運動或者報錯
答:檢查一下所發送的點位數據是否正常,并不是任意一組數據機器人都能執行,需要該數據在機器人工作范圍內,并且有正常的解。另外數據的單位為米跟弧度。