1 概述
此文是在實(shí)現(xiàn)modbus-RTU通訊的基礎(chǔ)上總結(jié)而來的,主要講述了如何提高window做工業(yè)控制時(shí)的實(shí)時(shí)性能。
PC機(jī)上做控制系統(tǒng),一般就是在window或者linux操作系統(tǒng)上做控制系統(tǒng)軟件開發(fā),window上做控制系統(tǒng),有如下優(yōu)勢(shì):
1)現(xiàn)有的設(shè)備驅(qū)動(dòng)支持
2)各類廠家提供的現(xiàn)成的卡板
3)以及比較平民化的開發(fā)平臺(tái)
4)數(shù)量眾多的開發(fā)人員。
2 提高實(shí)時(shí)性手段
window是一個(gè)非實(shí)時(shí)操作系統(tǒng),如果要做實(shí)時(shí)任務(wù)的話,有必要用些特別的手段,來提高其實(shí)時(shí)控制的能力。
1) 語言最好選擇C語言,之所以選擇C語言,因?yàn)楣I(yè)控制主要基于window API編程,使用很多window內(nèi)核的服務(wù)。
2) 多任務(wù)一般采用多線程來實(shí)現(xiàn),根據(jù)任務(wù)的緊要程度,設(shè)置線程的優(yōu)先級(jí)別,一定要設(shè)置優(yōu)先級(jí)。
3) 如果在一個(gè)線程中有多個(gè)任務(wù)的話,建議采用協(xié)程的方式實(shí)現(xiàn)多任務(wù),任務(wù)內(nèi)部最好不要調(diào)用Sleep()等休眠函數(shù)
4) 為了提高內(nèi)核的時(shí)鐘的調(diào)度精度,必須使用多媒體定時(shí)器并且將其精度設(shè)置為1ms,這樣內(nèi)核任務(wù)調(diào)度精度也提高為1ms,這估計(jì)是微軟的內(nèi)部耦合。如果不使用多媒體定時(shí)器的話,內(nèi)核定時(shí)器時(shí)鐘精度一般只有15ms左右。
5) 每個(gè)線程的一個(gè)循環(huán)必須釋放一次CPU,采用Sleep(1),這樣才能保證機(jī)器的CPU不被耗光,否則低優(yōu)先級(jí)的任務(wù)就沒有機(jī)會(huì)得到執(zhí)行了。
6)計(jì)時(shí)采用QueryPerformanceFrequency()和 QueryPerformanceCounter()函數(shù)來計(jì)時(shí),可以達(dá)到ns級(jí)別。
上面手段都是用戶空間的手段,在內(nèi)核空間應(yīng)該也有手段(應(yīng)用程序作為驅(qū)動(dòng)跑),但是我不熟,就不說了。
3 效果
使用以上幾種方式實(shí)現(xiàn)的控制程序,時(shí)間關(guān)鍵優(yōu)先級(jí)別多線程任務(wù)調(diào)度精度可以達(dá)到2-5ms級(jí)別,計(jì)時(shí)精度可以達(dá)到ns級(jí)別。這對(duì)于很多(大部分)要求不高的控制來說,基本是夠用的。
至于驅(qū)動(dòng)部分,window的驅(qū)動(dòng)的反應(yīng)速度還是挺快的(CPU占用率不過高的情況下面達(dá)到us級(jí)別的反應(yīng)),這個(gè)和我們用戶空間的程序不一樣,例如window的串口驅(qū)動(dòng),可以將接收FIFO設(shè)置為1,采用事件方式讀串口,即使波特率為115200bps,也不會(huì)丟失數(shù)據(jù)。
使用上面的方法,我在PC機(jī)上實(shí)現(xiàn)了modbus-RTU客戶端,其3.5T設(shè)置為5ms,可以很穩(wěn)定地和PLC主設(shè)備通訊。
4 硬實(shí)時(shí)
如果在PC機(jī)上追求真正的硬實(shí)時(shí),那么一般是在window或者linux系統(tǒng)中加入硬實(shí)時(shí)內(nèi)核,形成雙內(nèi)核系統(tǒng),例如RTX或者RTAI,這些都有成功的案例,例如西門子的基于RTX的數(shù)控系統(tǒng),基于RTAI的實(shí)時(shí)控制系統(tǒng),這些實(shí)時(shí)系統(tǒng)都是用于100us級(jí)別的硬實(shí)時(shí)系統(tǒng)中,需要開發(fā)者自己寫驅(qū)動(dòng),其架構(gòu)是實(shí)時(shí)內(nèi)核上跑實(shí)時(shí)任務(wù),普通內(nèi)核上跑一般任務(wù),實(shí)時(shí)任務(wù)和一般任務(wù)間通過通訊的方式溝通。由于我還沒有在這些實(shí)時(shí)系統(tǒng)上做過開發(fā),所以暫時(shí)不寫。