發布日期:2022-04-22 點擊率:76
關鍵詞: 正運動控制器 嵌入式
摘要:本文檔介紹如下內容: 一、嵌入式實時系統架構簡介和優勢 二、Basic程序簡單介紹 三、和PC程序的互動方式 四、Basic程序的掃描頻率和如何實現恒定頻率掃描
嵌入式實時系統架構簡介和優勢
正運動的ZMC系列控制器全部是獨立式控制器,可以脫離上位機像PLC一樣獨立工作的。自帶嵌入式實時系統,可以像PLC一樣實現高速的邏輯響應和IO響應,這樣的架構是進口運動控制器的標準架構。
進口控制器這么設計是因為這樣的架構有多種好處:
1)任務調度更簡單,實時性更好
Windows是屬于GPOS(General Purpose OS),考慮多種用戶需求,調度策略(dispatch algorithm)非常復雜,既要考慮前臺響應速度又要顧及后臺響應能力,既要考慮復雜任務的計算效率,又要考慮簡單任務的響應速度,所以盡管Windows非常強大,可以運行復雜的算法,可以運行復雜的語言和函數,但很多時候不適合用來處理需要實時響應的任務(打開任務管理器,看看Windows上有多少進程、多少線程,就可以想象Windows調度有多么復雜了)。所以在高實時性場合一般會使用實時系統(RTOS),而不用GPOS。(IOS和Android都屬于RTOS,并且嚴格限制后臺進程,來保證和用戶交互的響應速度。Windows CE也屬于RTOS)。
正運動控制器通過使用更簡單的調度策略(分時調度,犧牲一些計算效率),使用精簡指令(不使用復雜的帶類的面向對象的語言),實時性能就比Windows好很多,而且很容易實現多任務(Task)并行處理,所以,在需要實時響應的場合就不再需要運動控制器+PLC的組合方式,一個控制器搞定全部,沒有數據通訊的麻煩,簡單高效。
2)減輕PC計算壓力,在消耗大量計算資源的應用例如缺陷檢測中優勢更明顯。
把邏輯控制和運動控制全部使用Basic語言下載入控制器內,視覺處理留在PC,最大化減輕PC計算壓力。
3)開發調試更簡便。
Basic指令更簡潔、更清晰,開發速度更快。
即使不使用Basic寫程序,在PC上寫程序,通過Zdevelop開發調試工具也可以通過“軸參數”或者“在線命令”方便的查看當前各個參數狀態;可以通過“在線命令”實時修改參數;可以通過“示波器”查看速度曲線.......
(關于Zdevelop的詳細內容可以參考光盤資料中的入門文檔或者教學視頻。)
Basic程序簡單介紹
正運動控制器內部運行的程序主要是Basic程序,語法和VB一致,但比VB更簡單,對于軟件工程師來說非常友好。并且為了讓客戶使用更簡單,不需要定義數據類型,任意賦值自動判斷。甚至文件內變量和局部變量都不需要定義(只有全局變量需要),編譯器自動判斷,最終的結果是,非常容易上手,開發更快,不容易出錯。
Zdevelop開發工具可以進入調試模式,單步運行,觀察任務狀態、全局變量和局部變量。程序中可以方便的插入Print(等同于?操作符)指令把字符串或者變量輸出到終端方便Debug(相當于C語言中的printf)。
正運動控制器支持多任務(多線程),但創建多線程要比Windows程序簡單的多,可以非常方便的實現多任務并行運行。
可以通過ticks或者timer等方式實現恒定頻率掃描程序。
(更多詳細內容請參考ZBasic幫助手冊。)
這樣的架構,使正運動控制器不僅支持像其他國產控制器一樣完全在PC上調用函數來控制,也支持完全把運動控制和邏輯控制用Basic寫在控制器里,也支持部分程序寫在控制器里,部分程序寫在PC上,充分發揮各自的優勢,非常消耗CPU計算能力的復雜算法放在PC上,簡單的對響應速度要求很高的放在控制器上,兩者可以通過全局變量、Table、VR變量等方式來交換數據,Basic程序也可以向PC程序主動上報信息(PC程序中需要部署回調函數,不熟悉GC回收的話不建議這樣使用)。
和PC程序的互動方式
下面就是因為使用這種獨特架構帶來的其他國產控制器廠商所沒有的交互方式和獨有的函數:
控制器上的Basic程序可以通過指定一個自動運行號,讓這個任務上電自動運行,并且適當的時候調用其它任務(調用其他程序文件或者sub子程序)。也可以在合適的時機由PC程序發送Basic字符串指令來運行某個任務,例如控制器上有一個文件叫“BasicInit.bas ”,那么可以調用ZAux_Execute函數發送字符串(run “BasicInit ”)來運行起來這個文件,讓它以一個任務(線程)的方式運行起來。
Table是控制器上的超大一維數組,VR也是一維數組,但VR變量是掉電保存的,是存在電池備份內存上的,訪問速度又快,用不用擔心掉電丟失。具體的介紹可以參考ZBasic幫助文檔的第一章。
一方面不論控制器上Basic還是PC上的函數(如ZAux_Direct_SetTable)都可以共同訪問修改Table和VR變量,把table等作為控制器和PC共享buffer,實現大量數據異步交換,實現最大計算效率。另一方面PC還同時可以訪問用戶在Basic中定義的全局變量(例如global UsrVar),例如使用ZAux_Direct_GetVariableInt,但如果想要修改自定義全局變量的話就需要調用函數ZAux_DirectCommand發送(”UsrVar= 0 ”)這樣的字符串。
Basic程序運行完畢后,如果想要主動通知PC程序,而不是等待PC查詢,可以在PC程序中部署回調函數,PC不再需要輪詢查詢(如果不熟悉GC回收,不建議使用回調函數)。
目前PC上的函數已經很豐富了,但如果還是想要訪問控制器Basic支持的,而PC函數暫時不支持的軸參數(例如AXIS_STOPREASON)可以ZAux_Direct_SetParam和ZAux_Direct_GetParam來訪問。
如果想要一次讀取或者設置大量的IO變量、大量的位置狀態,可以使用輸入輸出函數中帶modbus前綴的函數,如GetModbusIn,這樣命名是因為在控制器內部有些modbus寄存器映射到這些地址上了(GetModbusIn只反應IO的真實狀態,反轉指令無效。如果需要反轉之后的狀態,需要使用ZAux_Direct_GetInMulti)。
備注1, 具體某個型號的控制器有多少Table和VR變量,支持多少任務(Task),都可以使用ZDevelop在“在線命令”中輸入?*max來查看。)
備注2, PC函數中DirectCommand和Execute的用法一致,都是通過PC發送一個控制器支持的Basic字符串指令,但DirectCommand運行速度更快,盡量使用DirectCommand,經測試,DirectCommand大多沒有返回字符串,所以參數中的最后一個返回的字符串長度可以設置為0,Execute發送的指令出錯后,第三個參數可以返回錯誤信息,想要顯示的話可以用System.Text.Encoding.ASCII.GetString把byte數組轉化為字符串(可以參考C#例程“例程8-功能測試”)。DirectCommand和Execute函數本身返回數值,正常運行則為0,不正常則返回非零值,所以在多數場合可能只要判斷返回值就可以了,不需要去查看返回字符串。
Basic程序的掃描頻率和如何實現恒定頻率掃描
用過PLC的客戶往往對正運動控制器嵌入式系統的掃描頻率有疑問,正運動控制器和PLC不一樣的地方是沒有標準的任務可供客戶使用來實現恒定頻率掃描,但可以自己寫程序使用多種方式讓控制器內的Basic任務實現恒定頻率掃描。
正運動控制器自帶的嵌入式實時系統運行方式和Windows程序比較相似的是如果沒有人為約束,沒有恒定的掃描頻率,CPU有空閑就去運行用戶程序,最大化利用CPU資源,所以除去固件運行所占用的時間和EtherCAT主站計算所占用的時間,剩下的全是用戶程序的運行時間。用戶的程序越短,掃描頻率越高。所以,雖然系統的中斷周期一般為1ms或者0.5ms,但如果程序足夠短,它在一個中斷周期內會運行很多次(具體數量取決于客戶程序),可能超過大多數客戶的需求(不同系列控制器CPU速度不一樣)。
當一個任務需要很高的實時性時,推薦把這部分任務單獨放入一個Task內,代碼行數盡量短,那么它的掃描頻率就非常高。對實時性要求不高的就和其它一起合并放入一個大的任務(Task)。
如何計算當前任務的掃描時間?
使用Ticks,賦予Ticks一個初始化值,每過1ms系統就會減一,可以用于計算掃描時間,例如:
(注意,ticks是屬于單個任務的變量,不是全局變量)
如何以恒定頻率掃描程序?
1)使用Ticks:
2)使用硬件時鐘Timer:
需要注意的是所有硬件時鐘中斷任務的處理任務(Task)只有1個,所以如果使用了多個硬件時鐘中斷,并且執行時間比較長,推薦把相關代碼放入另外一個程序文件里,run這個程序文件,不要讓中斷程序獨占當前task。
備注:
1)關于程序(Program)和任務(Task),任務和PC上的線程比較相似,并行運行,可以共享全局變量。一個程序文件(Program)可以被run起來多個Task(多個instance),所以在上面的示例注釋中寫著要小心不要run起來多個Task,把Timer_Start放入中斷程序結尾。(可以在調試模式下觀察現在有幾個task在運行)
2)因為控制器使用了實時系統,所以要使用循環掃描,可以很安全的使用while 1,這個Task的時間片用完后就會切換任務,不用擔心控制器資源都被鎖死在當前任務。
下一篇: PLC、DCS、FCS三大控
上一篇: MATLAB和Simulink在航