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信息,并拋棄新添加的腳本