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