CS機器人30020端口使用
1. 簡介
● def腳本為主程序腳本,一次僅支持一個def腳本運行,如果在第一個def腳本運行過程中,下 發(fā)第二個def腳本,則會強制停止第一個運行中的def腳本,去執(zhí)行新收到的def腳本。
● sec腳本可以與def腳本同時運行,不會導致def腳本停止,但sec腳本不支持運動指令,并且不 允許運行耗時指令(如sleep、串口、socket的超時操作等),有一定的限制。
● 由于def腳本與sec腳本的定義,導致目前的python運行過程中,無法實現(xiàn)一些動態(tài)的腳本插隊 運行,比如用戶在自己的上位機程序,實時計算出一些運行點位腳本,用戶無法在程序運行 的過程中,將一些實時計算的腳本插隊到當前運行的任務(wù)當中。存在一定的使用限制。
● 針對上述需求,CS控制軟件開發(fā)了Interpreter Mode(解釋器模式)功能,也就是30020接口,用于在一定的條件下,實現(xiàn)用戶腳本的插隊運行。
● 解釋器模式的使用,需要更新至2.11及以上的版本。
2. 操作流程
● 解釋器模式腳本命令
1. 解釋器功能
系統(tǒng)進入解釋器模式后,允許編程人員在任務(wù)運行時發(fā)送并插隊運行腳本語句,只需要腳本語 句為有效的python語句即可,用戶可以將腳本語句通過30020端口,發(fā)送到控制器,控制器解 收之后,會根據(jù)當前的狀態(tài),對語句進行編譯運行。發(fā)送到30020端口的腳本語句,會已隊列 的方式存儲在控制軟件內(nèi)部,并按順序執(zhí)行,腳本語句必須為單行語句,并以\n作為結(jié)束符, 如 set_tcp([0,0,0,0,0,0])\n
腳本語句參考CS腳本手冊
2. interpreter_mode(clearQueueOnEnter = True, clearOnEnd = True)
clearQueueOnEnter:為 True 時,會在進入解釋器模式時,清除所有進入之前收到的腳 本 隊列。
clearOnEnd:為 True 時,會在退出解釋器模式時,清除所有還未執(zhí)行的腳本隊列中的腳 本內(nèi)容。
該函數(shù)用于是任務(wù)進入解釋器模式,其為阻塞函數(shù)
30020端口的解釋器模式,是通過30001端口發(fā)送解釋器腳本命令觸發(fā)。
30001端口詳情,請參考CS用戶手冊。
例:30001 端口調(diào)用,需使用 def 腳本,采用 python 格式,要注意格式(縮進,大小寫 等)
def a():
interpreter_mode(clearQueueOnEnter = True, clearOnEnd = True)
end
3. end_interpreter()
該函數(shù)用于關(guān)閉任務(wù)的解釋器模式,此時阻塞的 interpreter_mode 函數(shù)會退出,該函數(shù)可 以在 30001 端口調(diào)用(sec 和 def 腳本效果相同),程序立即停止并退出解釋器模式。
也可以在 30020 中使用,發(fā)送到解釋器模式中,在腳本隊列中等待調(diào)用,隊列運行到該命 令后退出解釋器模式。
4. clear_interpreter()
該函數(shù)用于清除解釋器腳本隊列,可以在 30001 端口使用(sec 腳本),不建議用 def 腳 本,def 腳本執(zhí)行程序會立即停止并退出解釋器模式。
也可以在 30020 中使用,發(fā)送到解釋器模式中, 在腳本隊列中等待調(diào)用,調(diào)用后,會將 該函數(shù)執(zhí)行前接收到的腳本隊列清除,在其之后接收到的腳本則不受影響。
● 解釋器模式回復
1. 解釋器模式接收到可執(zhí)行的腳本語句后,將會通過返回以下格式信息,告知客戶端。
ack::
id為接受的語句被分配的唯一id,后續(xù)的一些狀態(tài)命令字返回值,會以該id信息返回。
2. 如果任務(wù)未處于運行狀態(tài),或腳本語句發(fā)生編譯錯誤或腳本隊列達到上限等等各種異常原因?qū)е陆邮艿哪_本沒有被正常的壓入解釋器隊列,解釋器會返回命令拋棄信息以及拋棄原因,格式如下。
discard::
3. 編譯錯誤:
觸發(fā)原因:一般為腳本格式錯誤,需要檢查確保下發(fā)的腳本格式是否正常的python格式的 代碼段
返回報文信息:discard: Compile error::
4. 任務(wù)狀態(tài)錯誤:
觸發(fā)原因:當前任務(wù)未處于運行狀態(tài)
返回報文信息:discard: Task is in an invalid state:
5. 腳本隊列的長度超限:
觸發(fā)原因:當前腳本隊列長度超過最大值(目前最大值為2000)
返回報文信息:discard: Too many interpreted messages:
6. 執(zhí)行解釋器前隊列清除:
觸發(fā)原因:由于clearQueueOnEnter參數(shù)設(shè)置為True,再打開解釋器模式之前發(fā)送到解釋器隊列的腳本,會在打開時(即調(diào)用interpreter_mode腳本)進行discard。
返回報文信息:discard: Cleaned up before interpretation:
7. 執(zhí)行解釋器后隊列清除:
觸發(fā)原因:由于clearOnEnd參數(shù)設(shè)置為True,再結(jié)束解釋器模式后,解釋器隊列中已有的腳本會在結(jié)束時(即調(diào)用end_interpreter腳本)進行discard。
返回報文信息:discard: Cleaned up after end:
8. 執(zhí)行隊列清除操作:
觸發(fā)原因:由于執(zhí)行clear_interpreter腳本discard掉的腳本隊列中的腳本。
返回報文信息:discard: Cleaned up:
● 解釋器模式關(guān)鍵字命令
解釋器模式的關(guān)鍵字命令,為非python腳本函數(shù),此類命令會在接收到后,馬上被執(zhí)行,不會進入腳本隊列等待執(zhí)行。
skipbuffer該命令可以讓腳本隊列跳過已經(jīng)接收到,但還未執(zhí)行的所有腳本命令(正在執(zhí)行的命令不會結(jié)束,會繼續(xù)正常運行到命令結(jié)束)。
● 解釋器模式狀態(tài)命令
1. statelastexecuted 命令
該命令會返回最后執(zhí)行過(或正在執(zhí)行)的命令id,返回格式如下:
state:: statelastexecuted
2. statelastinterpreted 命令
該命令會返回最新解收的已經(jīng)解析完成的腳本命令id,返回格式如下:
state:: statelastinterpreted
3. statelastcleared 命令
該命令會返回最后的被清除(調(diào)用clear_interpreter或解釋器模式退出)的命令id,返回格式如下:
state:: statelastcleared
4. stateunexecuted 命令
該命令會返回當前隊列中還未執(zhí)行的腳本命令(已skipbuffer的命令不會計數(shù)在內(nèi)),返回格式如下:
state: <#unexecuted>: stateunexecuted
5. state 命令
該命令會返回當前是否處于解釋器模式,返回格式如下:
state: 0: running: state
state: 0: stopped: state
● 示例
1.將機器人打到遠程模式

2. 用通訊助手創(chuàng)建一個 30001端口的客戶端,連接機器人并發(fā)送腳本使機器人進入解釋器模式

3.機器人進入解釋器模式,示教器顯示運行中,如下圖

4. 用通訊助手創(chuàng)建一個30020端口的客戶端

5.通過 30020 端口發(fā)送腳本使得機器人按先后順序依次執(zhí)行發(fā)送的腳本

6. 發(fā)送成功后,收到來自機器人的反饋

7.參考CS腳本手冊,依次發(fā)送指令給機器人,機器人將按順序依次執(zhí)行

3. 常見問題解答
1. 解釋器模式中創(chuàng)建的線程,不會再解釋器模式推出后,自動關(guān)閉,使用時,請自主管理好線程狀態(tài)。
2. 運行耗時腳本(如移動指令),會完整的運動結(jié)束后,才可以自動退出,中途即使調(diào)用了end_interpreter()命令,也不會強制停止耗時腳本運行,除非使用30001以def函數(shù)的形式發(fā)送。
3. 解釋器腳本隊列數(shù)量上限目前為2000條,腳本隊列數(shù)量超過該數(shù)量時,再次添加新的解釋器腳本,會返回discard信息,并拋棄新添加的腳本