如何提高window实时性能

来源:互联网 发布:matlab mac 支持10.7 编辑:程序博客网 时间:2024/04/29 11:39
 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级别的硬实时系统中,需要开发者自己写驱动,其架构是实时内核上跑实时任务,普通内核上跑一般任务,实时任务和一般任务间通过通讯的方式沟通。由于我还没有在这些实时系统上做过开发,所以暂时不写。