這是TwinCAT教程的最后一節,簡單講述了以C#為上位,通過ADS控制TwinCAT下位,實現完整控制兩軸模組的功能。可以發現,在上位層已經沒有了運動控制的代碼,不管是要執行哪種運動,無非是把目標參數寫入到綁定的對應變量,然后修改下位的任務號CurrentJob
在C#中一方面需要定時采集機器人的位置,速度還有狀態等信息,另一方面需要顯示這些信息(或者說利用這些信息)。采集需要足夠快(比如判斷一條命令是否執行完畢,應該是越快越好,可以立即執行下一條命令),而顯示則可以慢一點(可想如果需要大幅更新主界面數據,如果也5ms,10ms更新一次會消耗大量資源,同時也沒有什么實用價值)
為了實現單條命令的生成,我們需要得到一種格式,比如下面的兩句,要求命令的執行函數名(MOVEJ/MOVEL),目標位置(關節位置數組/TCP位置數組),目標速度,加速度,加加速度。每一家標准工業機器人的語法不太一樣,但是都是大同小異。其實可以完善的地方很多,比如用戶movej的時候給目標TCP位置而不是關節位置如何處理,比如多加了逗號,引號如何判斷等等
movej([-12.562,-16.032],a = 1200.00, v = 400.00, j = 3000.00);
movel(p[-143.939,78.180],a = 800.00, v = 200.00, j = 1200.00);
為了實現單條語句的執行,本質上就是生成語句的反過程(這也是單步執行和跳轉到指定行執行的原理),解析成功或者失敗都要有反饋(通過委托往外傳遞),一來可以提示用戶要執行的語句語法錯誤,二來在連續執行的時候如果發現了重復指令需要自動跳過執行下一行。
這就牽扯到了連續運行的原理,我們首先把textbox的所有文本按行分割,一行就認為是一句。給定一個起始下標默認從第0行開始執行(字符串命令拆分到數組的第一個元素),連續運行的時候先手動執行第一行。如果完成則C#會通過信號的上升沿捕捉到,然后通過委托告知主界面,主界面把下標加1,接着執行下一句,如果超過了總的行數則下標復位(當然如果是空行或者重復行,或者語法錯誤行,都應該跳過或者用其他處理辦法,比如加紅加粗表示這行有問題)
以上簡述的只是簡單的連續執行原理,所有語法需要自己定義,而且無法摻雜更加高級的語法和判斷(比如既然是一行作為一句,就無法嵌套if,switch語句這些判斷情況。而且由於所有語句需要自己解析,對於數組,指針,結構體,對象,委托等等變量都很難處理)。簡單點說這更像是一個G代碼的處理模式,一行就是一行,實用價值也是有的,但無法真正作為編譯器使用。
編譯器和高級語言的嵌入也是比較復雜的。例如C++或者Linux可以考慮LUA,可以發現官方的演示中測試自定義方法,也可以定義變量,for循環,if語句等等(具體如何嵌入到高級語言還需要讀者自己研究)
https://www.lua.org/cgi-bin/demo
如果是.NET平台可以使用微軟自帶的Roslyn編譯器,已經是開源的,而且網上有很多可以參考的范例
http://www.cnblogs.com/TianFang/archive/2012/02/14/2351817.html
此外還有一些Web平台,可以使用類似於JavaScript的語言作為編譯器(甚至不需要IDE可以在線編程)
官方網站:www.compilr.com
官方網站:www.jsfiddle.net
官方網站:www.botskool.com/online-compiler
更多教學視頻和資料下載,歡迎關注以下信息:
我的優酷空間:
http://i.youku.com/acetaohai123
我的在線論壇:
http://csrobot.gz01.bdysite.com/
問題交流:
QQ:910358960
