CS机器人30020端口使用
1. 简介
● def脚本为主程序脚本,一次仅支持一个def脚本运行,如果在第一个def脚本运行过程中,下 发第二个def脚本,则会强制停止第一个运行中的def脚本,去执行新收到的def脚本。
● sec脚本可以与def脚本同时运行,不会导致def脚本停止,但sec脚本不支持运动指令,并且不 允许运行耗时指令(如sleep、串口、socket的超时操作等),有一定的限制。
● 由于def脚本与sec脚本的定义,导致目前的python运行过程中,无法实现一些动态的脚本插队 运行,比如用户在自己的上位机程序,实时计算出一些运行点位脚本,用户无法在程序运行 的过程中,将一些实时计算的脚本插队到当前运行的任务当中。存在一定的使用限制。
● 针对上述需求,CS控制软件开发了Interpreter Mode(解释器模式)功能,也就是30020接口,用于在一定的条件下,实现用户脚本的插队运行。
● 解释器模式的使用,需要更新至2.11及以上的版本。
2. 操作流程
● 解释器模式脚本命令
1. 解释器功能
系统进入解释器模式后,允许编程人员在任务运行时发送并插队运行脚本语句,只需要脚本语 句为有效的python语句即可,用户可以将脚本语句通过30020端口,发送到控制器,控制器解 收之后,会根据当前的状态,对语句进行编译运行。发送到30020端口的脚本语句,会已队列 的方式存储在控制软件内部,并按顺序执行,脚本语句必须为单行语句,并以\n作为结束符, 如 set_tcp([0,0,0,0,0,0])\n
脚本语句参考CS脚本手册
2. interpreter_mode(clearQueueOnEnter = True, clearOnEnd = True)
clearQueueOnEnter:为 True 时,会在进入解释器模式时,清除所有进入之前收到的脚 本 队列。
clearOnEnd:为 True 时,会在退出解释器模式时,清除所有还未执行的脚本队列中的脚 本内容。
该函数用于是任务进入解释器模式,其为阻塞函数
30020端口的解释器模式,是通过30001端口发送解释器脚本命令触发。
30001端口详情,请参考CS用户手册。
例:30001 端口调用,需使用 def 脚本,采用 python 格式,要注意格式(缩进,大小写 等)
def a():
interpreter_mode(clearQueueOnEnter = True, clearOnEnd = True)
end
3. end_interpreter()
该函数用于关闭任务的解释器模式,此时阻塞的 interpreter_mode 函数会退出,该函数可 以在 30001 端口调用(sec 和 def 脚本效果相同),程序立即停止并退出解释器模式。
也可以在 30020 中使用,发送到解释器模式中,在脚本队列中等待调用,队列运行到该命 令后退出解释器模式。
4. clear_interpreter()
该函数用于清除解释器脚本队列,可以在 30001 端口使用(sec 脚本),不建议用 def 脚 本,def 脚本执行程序会立即停止并退出解释器模式。
也可以在 30020 中使用,发送到解释器模式中, 在脚本队列中等待调用,调用后,会将 该函数执行前接收到的脚本队列清除,在其之后接收到的脚本则不受影响。
● 解释器模式回复
1. 解释器模式接收到可执行的脚本语句后,将会通过返回以下格式信息,告知客户端。
ack::
id为接受的语句被分配的唯一id,后续的一些状态命令字返回值,会以该id信息返回。
2. 如果任务未处于运行状态,或脚本语句发生编译错误或脚本队列达到上限等等各种异常原因导致接受的脚本没有被正常的压入解释器队列,解释器会返回命令抛弃信息以及抛弃原因,格式如下。
discard::
3. 编译错误:
触发原因:一般为脚本格式错误,需要检查确保下发的脚本格式是否正常的python格式的 代码段
返回报文信息:discard: Compile error::
4. 任务状态错误:
触发原因:当前任务未处于运行状态
返回报文信息:discard: Task is in an invalid state:
5. 脚本队列的长度超限:
触发原因:当前脚本队列长度超过最大值(目前最大值为2000)
返回报文信息:discard: Too many interpreted messages:
6. 执行解释器前队列清除:
触发原因:由于clearQueueOnEnter参数设置为True,再打开解释器模式之前发送到解释器队列的脚本,会在打开时(即调用interpreter_mode脚本)进行discard。
返回报文信息:discard: Cleaned up before interpretation:
7. 执行解释器后队列清除:
触发原因:由于clearOnEnd参数设置为True,再结束解释器模式后,解释器队列中已有的脚本会在结束时(即调用end_interpreter脚本)进行discard。
返回报文信息:discard: Cleaned up after end:
8. 执行队列清除操作:
触发原因:由于执行clear_interpreter脚本discard掉的脚本队列中的脚本。
返回报文信息:discard: Cleaned up:
● 解释器模式关键字命令
解释器模式的关键字命令,为非python脚本函数,此类命令会在接收到后,马上被执行,不会进入脚本队列等待执行。
skipbuffer该命令可以让脚本队列跳过已经接收到,但还未执行的所有脚本命令(正在执行的命令不会结束,会继续正常运行到命令结束)。
● 解释器模式状态命令
1. statelastexecuted 命令
该命令会返回最后执行过(或正在执行)的命令id,返回格式如下:
state:: statelastexecuted
2. statelastinterpreted 命令
该命令会返回最新解收的已经解析完成的脚本命令id,返回格式如下:
state:: statelastinterpreted
3. statelastcleared 命令
该命令会返回最后的被清除(调用clear_interpreter或解释器模式退出)的命令id,返回格式如下:
state:: statelastcleared
4. stateunexecuted 命令
该命令会返回当前队列中还未执行的脚本命令(已skipbuffer的命令不会计数在内),返回格式如下:
state: <#unexecuted>: stateunexecuted
5. state 命令
该命令会返回当前是否处于解释器模式,返回格式如下:
state: 0: running: state
state: 0: stopped: state
● 示例
1.将机器人打到远程模式
2. 用通讯助手创建一个 30001端口的客户端,连接机器人并发送脚本使机器人进入解释器模式
3.机器人进入解释器模式,示教器显示运行中,如下图
4. 用通讯助手创建一个30020端口的客户端
5.通过 30020 端口发送脚本使得机器人按先后顺序依次执行发送的脚本
6. 发送成功后,收到来自机器人的反馈
7.参考CS脚本手册,依次发送指令给机器人,机器人将按顺序依次执行
3. 常见问题解答
1. 解释器模式中创建的线程,不会再解释器模式推出后,自动关闭,使用时,请自主管理好线程状态。
2. 运行耗时脚本(如移动指令),会完整的运动结束后,才可以自动退出,中途即使调用了end_interpreter()命令,也不会强制停止耗时脚本运行,除非使用30001以def函数的形式发送。
3. 解释器脚本队列数量上限目前为2000条,脚本队列数量超过该数量时,再次添加新的解释器脚本,会返回discard信息,并抛弃新添加的脚本