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